Entity Framework 4 InvalidOperationException при вставке или обновлении

Я использую сущности SelfTracking, все работало нормально, пока мы не добавили некоторые поля в справочную таблицу. Я не могу понять, в чем проблема со ссылочным внешним ключом! Я не разработал схему базы данных, но, как я вижу, все выглядит хорошо!

Вот сообщение об исключении с помощью трассировки стека.

A circular relationship path has been detected while enforcing a referential integrity constraints. Referential integrity cannot be enforced on circular relationships.

System.Data.Entity

Void FixupForeignKeysByReference(System.Collections.Generic.List`1[System.Data.Objects.EntityEntry])

   at System.Data.Objects.EntityEntry.FixupForeignKeysByReference(List`1 visited)
   at System.Data.Objects.EntityEntry.FixupForeignKeysByReference(List`1 visited)
   at System.Data.Objects.EntityEntry.FixupForeignKeysByReference(List`1 visited)
   at System.Data.Objects.EntityEntry.FixupForeignKeysByReference()
   at System.Data.Objects.ObjectStateManager.FixupKey(EntityEntry entry)
   at System.Data.Objects.EntityEntry.AcceptChanges()
   at System.Data.Objects.EntityEntry.ChangeObjectState(EntityState requestedState)
   at System.Data.Objects.ObjectStateManager.ChangeObjectState(Object entity, EntityState entityState)
   at Aitisi.Data.Model.SelfTrackingEntitiesContextExtensions.ChangeEntityStateBasedOnObjectState(ObjectContext context, IObjectWithChangeTracker entity) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Data.Model\AitisiSelfTrackModel.Context.Extensions.cs:line 732
   at Aitisi.Data.Model.SelfTrackingEntitiesContextExtensions.HandleEntity(ObjectContext context, EntityIndex entityIndex, RelationshipSet allRelationships, IObjectWithChangeTracker entity) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Data.Model\AitisiSelfTrackModel.Context.Extensions.cs:line 597
   at Aitisi.Data.Model.SelfTrackingEntitiesContextExtensions.ApplyChanges[TEntity](ObjectContext context, String entitySetName, TEntity entity) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Data.Model\AitisiSelfTrackModel.Context.Extensions.cs:line 85
   at Aitisi.Data.Model.SelfTrackingEntitiesContextExtensions.ApplyChanges[TEntity](ObjectSet`1 objectSet, TEntity entity) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Data.Model\AitisiSelfTrackModel.Context.Extensions.cs:line 41
   at Aitisi.Repository.Data.MtrLinesRepository.Update(MTRLINES mtrLine) in D:\Workfile\Web Projects\Allatini_Egrisis_Aitiseis\Aitisi.Repository.Data\MtrLinesRepository.cs:line 37

Это первый раз, когда я сталкиваюсь с такой ошибкой. Любая помощь приветствуется.

Спасибо.

2 ответа

Я думаю, что проблема со свойствами навигации. Я постараюсь привести короткий пример.

Допустим, у вас есть две сущности Order и Customer. Если вы извлекаете клиента и сохраняете его в памяти, добавьте его в экземпляр объекта Order ex. Order.Customer = Customer, после чего автоматическое исправление NavigationProperties добавит заказ к навигационным свойствам Customer.

Если затем вы создаете новый Заказ и добавляете того же Клиента в Заказ, Заказ получает исправление навигации с Клиентом, и Заказчик получает другой Заказ, в результате чего вы получаете две ссылки на объект Заказа в Классе Клиента. Если вы сохраните совокупный корневой объект Order, то ef будет выполнять итерацию по всем объектам в Order, найти два заказа в объекте Customer и попытаться сохранить их, но первый уже был сохранен, поэтому вы получите исключение. Чтобы избежать этого, не используйте объекты только внешние ключи. Order.CustomerId = Customer.Id;

У меня была эта проблема в прошлом, когда:

  1. Открытый контекст № 1
  2. Читать объект № 1
  3. Закрыть контекст # 1
  4. Выполните некоторую работу и создайте объект № 2, который является дочерним и ссылается на объект № 1.
  5. Откройте новый контекст, добавьте объект # 2 в его DbSet и SaveChanges

Поскольку состояние объекта # 1 не отслеживается в новом контексте, оно выдает предупреждение о циклической ссылке.

Чтобы обойти это, попробуйте метод DbSet(Of T).Attach, как показано в следующем коде:

Using ctx = New AtlasEntities
    modelDefinition = Await ctx.ModelDefinitions.First(Function(f) f.Id=Id)
End Using

ModelResult = modelDefinition.DoSomeWork()

Using ctx As New AtlasEntities
    ctx.ModelDefinitions.Attach(modelDefinition)
    ctx.ModelResults.Add(ModelResult)
    Dim success = Await ctx.SaveChangesQuickly.ConfigureAwait(False)
End Using
Другие вопросы по тегам