Создайте <Object> vs new <Object> в Entity Framework
У меня есть инициализатор/обновление для объекта сущности. Существует ли опасность использования
Dim myObject As SpecialThing = New SpecialThing()
Затем установите все значения (с помощью уже созданного обновления) или мне нужно использовать:
Dim myObject As SpecialThing = SpecialThing.Create()
Есть 30 параметров, и программа обновления уже устанавливает значения/обрабатывает ошибки. Просто хотите повторно использовать этот код.
Ответы
Ответ 1
Если вы создадите объект самостоятельно, он не будет привязан к контексту. Вам нужно прикрепить объект, чтобы обновить изменения в базе данных.
Несмотря на то, что если вы создаете Entity с помощью метода Create, он не будет привязан к контексту, и это сохранит DB с помощью метода SaveChanges.
http://msdn.microsoft.com/en-us/library/gg696136(v=vs.113).aspx
Ответ 2
Я не знаю, что именно вы имеете в виду myDB.CreateSpecialThing(.....)
. У меня три интерпретации:
-
objectContext.CreateObject<SpecialThing>()
-
dbContext.SpecialThings.Create()
(EF >= 4.1)
-
SpecialThing.Create(.....)
(статический метод EntityObject
производных объектов)
Третий метод - это только автогенерированный помощник, который принимает параметры (для обязательных полей), устанавливает свойства и возвращает объект. Это точно так же, как создание объекта с new
и настройка свойств впоследствии.
Первые два метода вступают в игру, если вы работаете с POCOs и используете ленивые загрузки или прокси-серверы отслеживания изменений. Эти методы создадут динамический прокси-объект объекта (который является динамическим классом, производным от вашего класса сущности), а не непосредственно сущность. Ни один из этих методов не привязывает объект к контексту, вы должны сделать это вручную - независимо от того, используете ли вы эти методы для создания объекта или создания его с помощью new
.
Пример, когда использование CreateObject<T>
/Create
может быть важным, предполагая объект User
с коллекцией virtual
Roles
:
using (var ctx = new MyDbContext())
{
var user = ctx.Users.Create();
user.Id = 1;
ctx.Users.Attach(user);
var roles = user.Roles;
}
Использование virtual
обеспечивает ленивую загрузку коллекции Roles
, а приведенный выше код будет загружать все роли пользователя 1 (или пустую коллекцию, если у пользователя нет ролей). Используя new
, с другой стороны...
using (var ctx = new MyDbContext())
{
var user = new User { Id = 1 };
ctx.Users.Attach(user);
var roles = user.Roles;
}
... не позволяет лениво загружать коллекцию, потому что User
не является динамическим прокси-объектом. Roles
будет null
, независимо от того, имеет ли пользователь роли или нет.
Итак, я бы сказал, что нет никакой угрозы создать сущность с new
. Вам просто нужно иметь в виду, что у вас нет функций ленивой загрузки или прокси-серверов отслеживания изменений для объекта, созданного с помощью new
.