Entity Framework 6.4 - Ошибка с самоссылающейся недействительной сущностью. Возможная ошибка? - PullRequest
0 голосов
/ 28 апреля 2020

Допустим, у меня есть 2 сущности:

class Parent
{
   public int ParentID {get; set; }
   public Child OneChild {get; set; }
}

class Child
{
    public int ChildID {get; set;}
    public Child SelfRelatedChild {get; set;}
}

Все, что мне нужно сделать в этом коде, это найти правильного Child в БД и создать связь со своим Родителем, но с two другой контекст. Примерно так:

Child myChild;
using (MyContext context = new MyContext())
{
   myChild = context.Children.Find(25);
}

и в другой части кода, которую я должен сохранить:

using (MyContext context = new MyContext())
{
   myParent.Child = myChild;
   context.Entry(myParent.Child).State = EntityState.Unchanged;
   context.SaveChanges();
}

Но при попытке создать что-то очень странное отношение «Родитель-ребенок», когда у ребенка есть собственная ссылка на другого ребенка, и наоборот, что-то вроде этого:

myChild1.SelfRelatedChild = myChild2;
myChild2.SelfRelatedChild = myChild1;

Теперь я получаю ошибку, пытаясь сохранить контекст.

После многих испытаний я обнаружил, что могу избежать проблем с установкой EntityState.Unchanged до создания графика:

using (MyContext context = new MyContext())
{
   context.Entry(myParent.Child).State = EntityState.Unchanged;       
   myParent.Child = myChild;
   context.SaveChanges();
}

Но я не могу этого сделать, потому что мне нужно установить отношение в классе, выходящем за рамки контекста. Почему это отличается? Почему я не получаю ошибку, только если я установил Entity State после отношения? Почему я получаю эту ошибку , только если у меня есть это "зеркальное отношение" между дочерними объектами?

К вашему сведению: еще один код, который я создал просто для того, чтобы повторить ошибку:

Child child1 = new Child ();
Child child2 = new Child ();

child1. SelfRelatedChild = child2;
child2. SelfRelatedChild = child1;

child1.ChildID = 30;
child2.ChildID = 31;

Parent parent = new Parent();
parent.OneChild = child1;

context.Parents.Add(parent);


//Set Unchanged
context.Entry(child1).State = EntityState.Unchanged;
context.Entry(child2).State = EntityState.Unchanged;

context.SaveChanges();

но у меня не возникает проблем, если я "переключаюсь" следующим образом:

//Set Unchanged
context.Entry(child1).State = EntityState.Unchanged;
context.Entry(child2).State = EntityState.Unchanged;

context.Parents.Add(parent);

К вашему сведению, я получаю эту ошибку: System.Data.Entity.Infrastructure.DbUpdateException: ' Произошла ошибка при сохранении сущностей, которые не предоставляют свойства внешнего ключа для своих отношений. Свойство EntityEntries вернет значение NULL, поскольку один объект не может быть определен как источник исключения. Обработка исключений при сохранении может быть упрощена путем предоставления свойств внешнего ключа в типах объектов. Подробности см. В InnerException. '

OptimisticConcurrencyException: оператор обновления, вставки или удаления магазина затронул непредвиденное количество строк (0). Объекты могут быть изменены или удалены с момента загрузки объектов. См. http://go.microsoft.com/fwlink/?LinkId=472540 для получения информации о понимании и обработке оптимистических c исключений параллелизма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...