Обновление отключенного объекта в структуре сущности
У меня есть данные, поступающие из других уровней, и это объект EF.
Когда это новое, я делаю это:
context.AddToCustomer(mynewobject);
context.SaveChanges();
но теперь мои данные формируют существующий объект, поэтому я хочу, чтобы контекст знал, что я хочу обновить данные и не вставлять их.
Я видел "ApplyPropertyChanges", но я не могу понять, как его использовать.
Я также видел, как люди это делали:
Customer existingOne = (from n in context.Customers
where n.id = mynewobject.id select n).First()
existingOne.name = mynewobject.name
existingOne.address= mynewobject.address
context.SaveChanges();
но это кажется немного странным, потому что я должен вручную установить все реквизиты и сначала прочитать весь объект.
Ответы
Ответ 1
Пока я сомневаюсь, стоит ли "оптимизировать" обновление, вы тем не менее можете делать то, что вы просите. Это проще в EF 4, но также возможно в EF 1. См. Также в этой статье.
public static void AttachAsModified<T>(this ObjectSet<T> objectSet, T entity) where T : class
{
objectSet.Attach(entity);
objectSet.Context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
Ответ 2
В Entity Framework 5 вот как вы это делаете:
/// <summary>
/// Updates an entity
/// </summary>
/// <param name="input">A entity</param>
/// <returns>The updated object</returns>
public TEntity Update(TEntity input)
{
using (var context = GetContext())
{
context.Set<TEntity>().Attach(input);
var entry = context.ChangeTracker.Entries<TEntity>().FirstOrDefault(e => e.Entity == input);
if (entry != null)
entry.State = EntityState.Modified;
context.SaveChanges();
}
return input;
}
Ответ 3
В моем сообщении для выполнения этого
Ответ 4
Взятый из "Стартовый комплект информации о сотрудниках" , вы можете рассмотреть фрагмент кода, как показано ниже:
public void UpdateEmployee(Employee updatedEmployee)
{
//attaching and making ready for parsistance
if (updatedEmployee.EntityState == EntityState.Detached)
_DatabaseContext.Employees.Attach(updatedEmployee);
_DatabaseContext.ObjectStateManager.ChangeObjectState(updatedEmployee, System.Data.EntityState.Modified);
_DatabaseContext.SaveChanges();
}