2016-05-18 2 views
-1

У меня есть рабочий Update метод, который просто изменив значение свойства и вызывает SaveChanges() от контекста дб:Entity Framework не меняется EnityState на обновления

public void Update(int id, string name) 
{ 
    var entity = context.Entities.Single(x => x.Id == id); 
    entity.Name = name; 
    context.SaveChanges(); 
} 

таким образом изменения действительно получить применяется, однако EnityState остается «Без изменений». Любые мысли о том, почему? Я пытаюсь избежать необходимости говорить EF, что происходит явно, например. используя context.Entry(entity).State = EntityState.Modified;

Проблема заключается в том, я использую состояние в переопределен метод SaveChanges:

public override int SaveChanges() 
{ 
    var context = ((IObjectContextAdapter)this).ObjectContext; 

    var objectStateEntries = 
     context.ObjectStateManager 
     .GetObjectStateEntries(EntityState.Added | EntityState.Modified); 
    ... 
    return base.SaveChanges(); 
} 

..when отладки, я могу видеть, что состояние моего лица является Unchanged.

+2

Перед вызовом SaveChanges состояние IST ОБНОВЛЕНО После вызова SaveChanges, состояние ИЗМЕНЕНИЙ –

+2

После этой строки «entity.Name = имя;» состояние должно быть изменено, но после этого «context.SaveChanges();» он должен быть снова изменен. – jannagy02

+0

@CyrilIselin это не так. см. обновление. – Tsar

ответ

2

Если вы не отключили change tracking of EF или proxy creation, у вас не должно возникнуть проблемы с этим обновлением. EF по умолчанию дорожки автоматически меняются, когда вы отвечаете требованиям, которые вы можете найти в этом msdn page. Если вы соответствуете этим требованиям и позже проверяете, тип вашего объекта однажды возвращается методом расширения Single, вы увидите, что это прокси-класс, а не ваш настоящий класс. Итак, сначала проверьте, соответствуют ли вам все те требования, которые EF необходимо отслеживать автоматически, вы будете в порядке с этим кодом.

Для любого из этих прокси должны быть созданы:

  • Пользовательский класс данных должны быть объявлены с public доступа.

  • Пользовательский класс данных не должен быть sealed

  • Пользовательский класс данных не должен быть abstract.

  • Пользовательский класс данных должен иметь открытый или защищенный конструктор, который не имеет параметров. Используйте защищенный конструктор без параметров , если вы хотите, чтобы метод CreateObject использовался для создания прокси-сервера для объекта POCO. Вызов метода CreateObject не гарантирует создание прокси-сервера: класс POCO должен соответствовать следующим требованиям, описанным в этом разделе: .

  • Класс не может реализовать интерфейсы IEntityWithChangeTracker или IEntityWithRelationships, поскольку прокси-классы реализации этих интерфейсов.

  • Параметр ProxyCreationEnabled должен иметь значение true.

Для отслеживания изменений прокси:

  • Каждое свойство, которое отображается в свойство типа сущности в модели данных должны иметь не запечатан, общественности и virtual получить и set аксессуаров.

  • Навигационной свойство, которое представляет собой «много» конца отношений должны возвращать тип, который реализует ICollection, где Т является типом объекта на другом конце связи.

  • Если вы хотите, тип прокси должен быть создан вместе с объектом, используйте причем способ CreateObject на ObjectContext при создании нового объекта , вместо нового оператора.

+0

Мне не нравится изменение конфигурации по умолчанию/добавление дополнительного кода, просто хочу понять, почему EF не меняет 'EntityState' – Tsar

+0

Вы проверили, соответствует ли ваша организация требованиям, предъявляемым EF к созданию прокси-класса? Проверьте страницу msdn, которую я привел в своем ответе – octavioccl

+0

, она предоставлена ​​'ProxyCreationEnabled = true' по умолчанию. – Tsar

Смежные вопросы