2015-03-08 4 views
0

Я новичок в инфраструктуре сущности, я использовал Nhibernate. В Nhibernate для обновления объекта нет необходимости передавать идентификатор, вы просто передаете объект, а Nhibernate соответствует его идентификатору и обновляет объект. В EF я использую этот подход:Лучший способ обновления объекта в сущности Framework

 protected virtual bool UpdateEntity(TEntity entity, int id) 
     { 
      using (var ctx = new GenericContext()) 
      { 
       var list = ctx.Set<TEntity>().ToList(); 
       ctx.Entry<TEntity>(ctx.Set<TEntity> ().Find(id)).CurrentValues.SetValues(entity); 
       return ctx.SaveChanges() > 0; 
     } 
     } 

Для этого требуется идентификатор для обновления объекта. Это лучше всего? Есть какой-то способ обновить объект, просто передав объект, не получив его первым?

ответ

3

Это зависит, если у вас включена функция автоматического слежения. По умолчанию это означает, что любой объект, который вы извлекаете, будет сохранен в файле DbContext, который вы использовали для его получения, а также копии его исходных значений.

Затем, если вы отредактируете эту сущность, когда вы вызываете DbContext.SaveChanges(), EF будет проходить через все ваши сущности и сравнивать их с их исходными значениями, и если они были изменены, он выполнит инструкцию по обновлению.

Итак, если вы оба извлекаете объект, редактируете его и хотите сохранить его, все в рамках одного и того же контекста. Все, что вам нужно сделать, это позвонить contxt.SaveChanged(), а EF будет работать, чтобы этот объект был обновлен. (Пока вы не отключили Автотрекинг)

заимствование из Эрикс кода:

var ctx = new SchoolDBEntities() 

var student = ctx.Students.Where(s => s.Name == "John Doe").First();  

student.Name = "Erik Blessman"; 

ctx.SaveChanges(); // Will update the student 

В противном случае, если этот объект создан вручную и не принадлежит ни к какой DbContexts вам нужно

  1. Прикрепите ваше устройство к новому (или вашему току) DbContext(это будет автоматически сделано для вас, если вы установили EntityState.Modified)
  2. Скажите DbContext этот объект был изменен
    • var entry = context.Entry(entity); // Gets the entry for entity inside context
    • entry.State = EntryState.Modified; // Tell EF this entity has been modified
  3. Факультативно СКАЖИТЕ EF, какие свойства на вашей организации были изменены
  4. SaveChanges вызовов()
+0

Хороший ответ, спасибо. Обратите внимание на «Присоединение сущности к« DbContext », как вы говорите, вы можете прикреплять, но настройка для« Модифицированная »будет прикреплена к вам; [подробнее] (https://stackoverflow.com/q/30987806/1175496) –

3

http://www.entityframeworktutorial.net/EntityFramework4.3/update-entity-using-dbcontext.aspx

Student stud; 
    //1. Get student from DB 
    using (var ctx = new SchoolDBEntities()) 
    { 
     stud = ctx.Students.Where(s => s.StudentName == "New Student1").FirstOrDefault<Student>(); 
    } 

    //2. change student name in disconnected mode (out of ctx scope) 
    if (stud != null) 
    { 
     stud.StudentName = "Updated Student1"; 
    } 

    //save modified entity using new Context 
    using (var dbCtx = new SchoolDBEntities()) 
    { 
     //3. Mark entity as modified 
     dbCtx.Entry(stud).State = System.Data.Entity.EntityState.Modified;  

     //4. call SaveChanges 
     dbCtx.SaveChanges(); 
    } 
+0

Это то же самое, что я использую, получаю t он объектив из db, а затем модифицировал его. И я не получу второй шаг, вы говорите, что вам нужно указать, какие свойства изменились. Я просто хочу передать объект с изменениями, а затем EF получить объект, используя его id, и изменить его. Как и спящий режим. Без пояснения, указывающего идентификатор. –

Смежные вопросы