Подтвердить что ты не робот

Обновление отключенного объекта в структуре сущности

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

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

4b9b3361

Ответ 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;
        }

Ответ 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();
        }