У меня есть простой объект для Страны, которая производится Платформой Объекта 4 использования RC VS 2010. Это смотрит что-то как ПОСТЕПЕННО ниже.
public class Company
{
public int ID { get; set; }
public string Name { get; set; }
public string ISOCode { get; set; }
public boolean Active { get; set; }
}
Мой код репозитория ниже. 'дб' является моим контекстом, который инициализируется в конструкторе.
public void EditCountry(Country countryToEdit)
{
db.Countries.Attach(new Country { ID = countryToEdit.ID });
db.Countries.ApplyCurrentValues(countryToEdit);
db.SaveChanges();
}
Изменение поля Active от лжи до истинного в countryToEdit производит следующий SQL
update [dbo].[Countries]
set [Name] = @0, [ISOCode] = @1, [Active] = @2
where ([ID] = @3)
@0 nvarchar(256),@1 nvarchar(12),@2 bit,@3 int,@0='Algeria',@1='DZ',@2=1,@3=4
Это ожидается.
Если я изменяю поле Active от истинного до лжи в countryToEdit, следующий SQL производится
update [dbo].[Countries]
set [Name] = @0, [ISOCode] = @1
where ([ID] = @2)
@0 nvarchar(256),@1 nvarchar(12),@2 int,@0='Afghanistann',@1='AF',@2=1
Нет никакой попытки, предпринятой для обновления поля Active.
В этом ApplyCurrentValues в EF 4 вопросе есть ответ.
Это должно быть
db.Countries.Attach(db.Countries.Single(c => c.ID == countryToEdit.ID));
Если вы присоедините пустой объект-заглушку, то булевы поля инициализируются в false. Вызов ApplyCurrentValues не видит изменений в значении boolean между объектом-заглушкой и редактируемым объектом.
Приведенный выше код добавляет еще один запрос к БД, но я могу с этим жить.