Последствия DbSet.Create против новой сущности () - PullRequest
51 голосов
/ 05 сентября 2011

Я немного озадачен тем, использовать ли DbSet.Create или просто создать новую сущность и добавить ее. Я не очень понимаю последствия использования DbSet.Create.

Я понимаю, что DbSet.Create создаст прокси-версию, если применимо, но я не совсем понимаю, что это значит. Почему меня это волнует? Мне кажется, что пустой класс Proxied не более полезен, чем класс без прокси, поскольку нет связанных сущностей для отложенной загрузки.

Можете ли вы сказать мне разницу, помимо очевидного? А почему ты так заботишься?

1 Ответ

54 голосов
/ 05 сентября 2011

Сценарий, в котором использование DbSet<T>.Create() имеет смысл, - это присоединение существующего объекта к контексту, а затем использование отложенной загрузки связанных объектов.Пример:

public class Parent
{
    public int Id { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Тогда будет работать следующее:

using (var context = new MyDbContext())
{
    var parent = context.Parents.Create();
    parent.Id = 1; // assuming it exists in the DB
    context.Parents.Attach(parent);

    foreach (var child in parent.Children)
    {
        var name = child.Name;
        // ...
    }
}

Здесь запускается отложенная загрузка дочерних элементов (возможно, в результате получается пустая коллекция, но не null).Если вы замените context.Parents.Create() на new Parent(), цикл foreach завершится сбоем, поскольку parent.Children всегда null.

Edit

Другой пример был здесь(заполнение свойства внешнего ключа новой сущности и затем лениво загруженное свойство навигации после вставки новой сущности в БД): Свойства отложенной загрузки после вставки

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