2014-01-02 3 views
0

Я использую EF 6.0.2 и пытаюсь обновить только поле Status объекта.Почему исключение проверки не задано в поле, которое не обновляется?

var drama = new Drama { Id = id }; 
using (var ctx = new DataContext()) { 
    ctx.Dramas.Attach(drama); 
    drama.Status = state; 
    ctx.SaveChanges(); 
} 

Это бросает ValidationException: требуется ClassName поле.

Сущность уже существует и действительна (включая наличие ClassName). Id - это ключ сущности.

Что здесь происходит, чтобы вызвать исключение?

+0

Что ваш DataContext выглядеть? – antiduh

+0

У него, вероятно, около 20 сущностей. Не уверен, что вы имеете в виду? – James

ответ

0

Вы говорите, что в базе данных уже есть объект с данным Id, и вы хотели бы изменить его значение Status?

Это не то, что вы делаете в своем коде. Вы создали новый объект с данным Id и установите только его значение Status. Вот почему он бросает поле ValidationException: ClassName пусто, если вы не устанавливаете его в конструкторе Drama.

Чтобы изменить существующий объект сначала вы должны восстановить его из базы данных, а затем изменить его и сохранить изменения:

using (var ctx = new DataContext()) { 
    var drama = ctx.Dramas.Single(d => d.Id == id); 
    drama.Status = state; 
    ctx.SaveChanges(); 
} 

EDIT:

Если вы хотите, чтобы имитировать сценарий редактирования отстраненно entity, вам все равно нужны его значения. Попробуйте выполнить все требования проверки перед установкой лица (т.е. заполнить ClassName), затем Attach его, обновите Status и SaveChanges:

var drama = new Drama { Id = id, ClassName = "Dummy" }; 
using (var ctx = new DataContext()) { 
    ctx.Dramas.Attach(drama); 
    drama.Status = state; 
    ctx.SaveChanges(); 
} 
+0

Но это приводит к двум отдельным операциям с базой данных, и я делаю это в цикле в своем фактическом коде (должен был сказать это раньше). Чтобы изменить только одно или два свойства без первого получения всего объекта, я всегда мог использовать метод Attach. Но не знаю, почему он сейчас не работает. – James

+0

Я согласен с @Damir, и вот как мы делаем изменения в EF – mmssaann

+0

Скажем, у вас есть миллион записей (возможно, некоторые с очень большими полями TEXT или BLOB), и вы хотите перевернуть логическое поле в каждом из них с True на False. Загрузка их полностью в память была бы очень расточительной. – James

0

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

using (var ctx = new DataContext()) { 
    drama = ctx.Dramas.Where(O => O.Id = id); 
    drama.Status = state; 
    ctx.Dramas.Attach(drama); 
    ctx.SaveChanges(); 

}

Надеется, что это помогает

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