Создайте <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.