Создать <Object>против нового <Object>в Entity Framework - PullRequest
11 голосов
/ 21 ноября 2011

У меня есть инициализатор / апдейтер для объекта-сущности.Есть ли какая-либо опасность в использовании

Dim myObject As SpecialThing = New SpecialThing()

Затем установите все значения (с помощью уже созданного средства обновления) или мне нужно использовать:

Dim myObject As SpecialThing = SpecialThing.Create()

Существует 30 параметрови программа обновления уже устанавливает значения / обрабатывает ошибки.Просто хочу повторно использовать этот код.

Ответы [ 2 ]

35 голосов
/ 21 ноября 2011

Я не знаю, что именно вы имеете в виду под myDB.CreateSpecialThing(.....). У меня есть три интерпретации:

  • objectContext.CreateObject<SpecialThing>()

  • dbContext.SpecialThings.Create() (EF> = 4,1)

  • SpecialThing.Create(.....) (статический метод EntityObject производных сущностей)

Третий метод - это только автоматически сгенерированный помощник, который принимает параметры (для обязательных полей), устанавливает свойства и возвращает объект. Это точно так же, как создание объекта с new и последующая установка свойств.

Первые два метода вступают в игру, если вы работаете с POCO и используете ленивую загрузку или меняете прокси отслеживания. Эти методы создадут динамический прокси объекта (который является динамическим классом, производным от вашего класса объектов), а не непосредственно объект. Ни один из этих методов не присоединяет сущность к контексту, вы должны сделать это вручную - независимо от того, используете ли вы эти методы, чтобы создать сущность или создать ее с помощью 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.

3 голосов
/ 21 ноября 2011

Если вы создадите объект самостоятельно, он не будет привязан к контексту. Вам нужно прикрепить объект , чтобы обновления могли обновляться в базе данных.

Несмотря на то, что если вы создаете Entity с помощью метода Create, он не будет привязан к контексту и будет сохранен в БД методом SaveChanges. http://msdn.microsoft.com/en-us/library/gg696136(v=vs.113).aspx

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