更新实体框架中的断开对象

时间:2009-11-11 13:23:25

标签: entity-framework

我有一些来自其他层的数据,它代表一个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();

但这似乎有点奇怪,因为我必须手动设置所有道具并首先读取整个对象。

4 个答案:

答案 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();
        }