1

Когда я создаю новый объект EF, я сначала прикрепляю его к DbSet, а затем устанавливаю одно из своих свойств навигации в новый экземпляр другого объекта EF. Затем я добавляю первый EF в DbSet и вызываю save. Я получаю следующее исключение:Entity Framework InvalidOperationException при сохранении

System.InvalidOperationException: The changes to the database were committed 
successfully, but an error occurred while updating the object context. The 
ObjectContext might be in an inconsistent state. Inner exception message: A 
referential integrity constraint violation occurred: The property value(s) of 
'Location.Id' on one end of a relationship do not match the property value(s) 
of 'Pool.LocationId' on the other end. 

Вот мой код:

ORMContext context = new ORMContext(); 

var l = context.Locations.Create(); 
context.Locations.Attach(l); 
...set properties 
context.Locations.Add(l); 

var p = context.Pools.Create(); 
context.Pools.Attach(p); 
p.Location = l; 
...set properties 
context.Pools.Add(p); 

context.SaveChanges(); 

То, что я думаю, что происходит это Location объект является новым и его Id является 0 по умолчанию. EF обновляет внешний ключ на Pool (который установлен в 0), а затем Location.Id обновляется после сохранения объекта Location в базу данных. Таким образом, Location.Id теперь установлено в соответствующее значение в базе данных, например 149, а Pool.LocationId по-прежнему установлено в 0.

Как избежать этого исключения? Или, как я полагаю, с этим справиться?

ответ

2

Вы можете сохранить после добавления местоположения, таким образом ссылка на сущность будет установлена ​​

ORMContext context = new ORMContext(); 

    var l = context.Locations.Create(); 
    context.Locations.Attach(l); 
    ...set properties 
    context.Locations.Add(l); 

    context.SaveChanges(); // save here, that way the location will get its Id 
    var p = context.Pools.Create(); 
    context.Pools.Attach(p); 
    p.Location = l; 
    ...set properties 
    context.Pools.Add(p); 

    context.SaveChanges(); 

Это будет путем

+0

Согласован. Это решило бы проблему. Однако это не вариант. Затем он сохранил бы любые другие изменения, сидящие в DbContext, которые я не могу сделать, пока пользователь не выберет «Сохранить в пользовательском интерфейсе». –

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

  • Нет связанных вопросов^_^