Entity Framework InvalidOperationException при сохранении
Когда я создаю новый объект EF, я сначала присоединяю его к DbSet, затем устанавливаю одно из его свойств навигации для нового экземпляра другого объекта EF. Затем я добавляю первый EF в DbSet и вызываю save. Я получаю следующее исключение:
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
,
Как мне избежать этого исключения? Или как мне с этим справиться?
1 ответ
Вы можете сохранить после добавления местоположения, таким образом, будет установлена ссылка на объект
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();
Это был бы способ