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();

Это был бы способ