обновить отключенный объект в рамках сущности - PullRequest
13 голосов
/ 11 ноября 2009

У меня есть данные, поступающие с других уровней, и они представляют объект 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 ]

8 голосов
/ 27 сентября 2012

В 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;
        }
4 голосов
/ 11 ноября 2009

Хотя я спрашиваю, стоит ли вообще «оптимизировать» обновление, вы все же можете делать то, что просите. Это проще в 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);
}
0 голосов
/ 19 марта 2011

Взято из Стартового комплекта информации о сотрудниках , вы можете рассмотреть фрагмент кода, как показано ниже:

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();
        }
0 голосов
/ 02 ноября 2010

Есть в моем сообщении , чтобы выполнить это

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