Это образец, иллюстрирующий проблему
Человек должен иметь тип PersonType
HasRequired(o => o.PersonType).WithMany(o => o.Persons);
Затем, используя отключенный объект. Когда я это сделаю,
//Person with ID=4 exists in DB
Person p = new Person() { PersonId = 4, PersonType= null, Address = ... };
//PersonType is null here
using (var ctxNew = new Context())
{
var entry = ctxNew.Entry(p);
entry.State = System.Data.Entity.EntityState.Modified;
ctxNew.SaveChanges(); //Ok. But shouldn't be
}
По какой-то причине SaveChanges() успешно выполняется без ошибок. Но, как я понимаю, это должно привести к отказу. Это проблема для меня, так как я получаю такие объекты из своего уровня обслуживания, и я не хочу, чтобы они терпели неудачу. Какая проблема здесь?
Проблема здесь в том, что когда вы делаете:
entry.State = System.Data.Entity.EntityState.Modified;
EF отмечает как Изменено только указанное лицо. Если у вашего объекта есть другие связанные объекты (например, свойство навигации PersonType), они останутся в состоянии без изменений и не будут отправлены в базу данных (и не проверены) на вызов метода SaveChanges.
Для таких свойств вы можете изменить свое состояние на Модифицированное, вызвав метод SetModifiedProperty:
entry.SetModifiedProperty("PersonType");