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
- Закрыть контекст # 1
- Выполните некоторую работу и создайте объект № 2, который является дочерним и ссылается на объект № 1.
- Откройте новый контекст, добавьте объект # 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