Установка DataContext для экземпляра Entity после его получения - PullRequest
2 голосов
/ 15 апреля 2011

Я пытаюсь найти способ, чтобы DataContext был доступен внутри сущностей.

Я хочу сделать что-то вроде этого:

partial public class MyEntity

    public DataContext as MyDataContext

    private sub OnLoaded()
        Me.DataContext = <the context that retrieved this instance>
    end sub

end class

Во-первых, можно ли что-то подобное сделать? Во-вторых, если предположить, что я не собираюсь использовать эту сущность с каким-либо другим DataContext, есть ли какие-либо опасности или ошибки в этом?

Вот как я это делаю сейчас:

partial public class MyDataContext

    public function GetMyEntity(byval id as integer) as MyEntity
        dim o = MyEntities.SingleOrDefault(function(e) e.id = id)
        if o isnot nothing then o.DataContext = Me
        return o
    end function

end class

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Хотя вы не указали реальную причину этого, просто sidenote от MSDN :

В общем случае экземпляр DataContext рассчитан на одну единицу работа "однако ваше приложение определяет этот термин. A DataContext является легкий и не дорогой Создайте. Типичный LINQ to SQL приложение создает DataContext экземпляры в области видимости метода или как член недолговечных классов, которые представляют собой логический набор связанных операции с базой данных.

и один еще :

Не пытайтесь повторно использовать экземпляры DataContext. Каждый DataContext поддерживает состояние (в том числе личность кеш) для одного конкретного редактирования / запроса сессия. Чтобы получить новые экземпляры на основе о текущем состоянии базы данных, используйте новый DataContext.

и, наконец,

... Любые члены экземпляра не являются гарантированно безопасен для потоков.

Но все же в некоторых случаях полупостоянные решения могут быть очень полезными. Взгляните на статью Рика Страчла: Linq to SQL DataContext Lifetime Management . В ней рассматриваются различные подходы к управлению DataContext. Один из них - Создание индивидуального бизнес-объекта DataContext - это именно то, что вам нужно.

1 голос
/ 17 апреля 2011

Вы можете использовать одноэлементный шаблон в DataContext, но вам понадобится какое-то управление жизненным циклом для него, так как нецелесообразно долго его хранить. (запрос заканчивается, возможно, удалите его)

Пример на C #, но я надеюсь, что вы понимаете это.

public class MyDataContext
{       
    public static MyDataContext Current 
    {
        get
        {
            MyDataContext context = (MyDataContext)HttpContext.Current.Items["Context"];
            if(context == null)
            {
                context = new MyDataContext();
                HttpContext.Current.Items["Context"] = context;
            }
            return context;
        }
    }
}

public class MyEntity
{
    public MyDataContext DataContext
    {
        get{ return MyDataContext.Current;}
    }
}

В Global.asax вы можете подключить событие Application_EndRequest и вызвать MyDataContext.Current.Dispose();, чтобы избавиться от контекста вручную, а не ждать, пока GC сделает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...