Entity Framework 6 Создать() vs new
В чем разница между добавлением сущности этими двумя способами?
MyEntity me = new MyEntity();
entities.myentities.Add(me);
против
MyEntity me = entities.myentities.Create();
Должен ли я добавить "я" во втором примере? Если да, есть ли какое-то преимущество, так или иначе?
Большое спасибо!
Ответы
Ответ 1
MyEntity me = new MyEntity();
создаст новый экземпляр MyEntity
MyEntity me = entities.myentities.Create();
создаст экземпляр с прокси-сервером MyEntity
(при условии, что ваш контекст настроен для создания прокси)
Этот прокси-сервер переопределяет некоторые виртуальные свойства объекта, чтобы вставлять крючки для выполнения действий автоматически при доступе к свойству. Например, этот механизм используется для поддержки ленивой загрузки отношений.
отсюда
Ответ 2
Да, вам все равно нужно добавить его. Из документации метода Create:
Создает новый экземпляр объекта для типа этого набора. Обратите внимание, что этот экземпляр НЕ добавляется или не присоединяется к набору.
Ответ 3
MyEntity me = new MyEntity();
равно
MyEntity me = entities.myentities.Create();
Оба из вышеперечисленных создают новый экземпляр MyEntity, но не присоединяют его к DbSet, представленному myentities.
Линия
entities.myentities.Add(me)
прикрепляет экземпляр к DbSet, хотя вы также можете использовать Attach(me)
.
Во втором примере требуется "me", поскольку вы создадите экземпляр объекта без ссылки для хранения объекта.
Ответ 4
Если вы используете наследование объекта, вы можете добиться хорошего поведения полиморфизма с помощью метода Create(), поскольку он всегда создает правильную Entity (не общую).
Пример:
public DbSet GetDialDbSet(DialEnum type)
{
DbSet ret;
switch (type)
{
default:
case DialEnum.MAPPING_REASON:
ret = DialMappingReasons;
break;
case DialEnum.PROCESSING_INFORMATION:
ret = DialProcessingInformation;
break;
}
return ret;
}
и использование полиморфизма:
DialDerived entity = (DialDerived) Db.GetDialDbSet(type).Create()