我有一些来自其他层的数据,它代表一个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();
但这似乎有点奇怪,因为我必须手动设置所有道具并首先读取整个对象。
答案 0 :(得分:8)
在实体框架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;
}
答案 1 :(得分:4)
虽然我质疑是否值得“优化”更新,但您可以按照自己的要求行事。 It's easier in EF 4,还有possible in EF 1。另请参阅this article。
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 :(得分:0)
我的post执行此操作
答案 3 :(得分:0)
从Employee Info Starter Kit获取,您可以将代码段视为如下:
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();
}