Структура сущностей:Ошибка самостоятельного соединения
-
21-12-2019 - |
Вопрос
У меня есть следующий класс:
public class Application
{
public int Id { get; set; }
/* Other properties */
public int LegacyId { get; set; }
public int LegacyParentId { get; set; }
public int? ApplicationSupersessionId { get; set; }
public virtual ICollection<Application> ApplicationSupersessions { get; set; }
public Application()
{
ApplicationSupersessions = new List<Application>();
}
}
Где ApplicationSupersessions
является необязательным самосоединяющимся объектом.У меня уже есть данные, добавленные в мой Applications
таблицу, и я пытаюсь скорректировать данные, которые в настоящее время выглядят следующим образом:
Но мне нужны приложения 5413
и 5414
чтобы иметь возможность ApplicationSupersessionId
от 5415
поскольку именно так это выглядит в нашей устаревшей системе, вот почему я добавил 2 Legacy
столбцы
Итак, я попробовал следующее:
var applications = CatalogueContext.Applications.ToList();
foreach (var application in applications)
{
var legacyChildren = applications.Where(x =>
x.LegacyParentId == application.LegacyId).ToList();
if(legacyChildren.Any())
{
foreach(var child in legacyChildren)
{
application.ApplicationSupersessions.Add(child);
}
CatalogueContext.Entry(application).State = EntityState.Modified;
}
}
CatalogueContext.SaveChanges();
Но я получаю следующую ошибку в строке CatalogueContext.Entry(application).State = EntityState.Modified;
:
Решение
Мне удалось решить эту проблему.У меня в конфигурации были неправильно настроены отношения.
У меня было это:
HasOptional(x => x.ApplicationSupersessions)
.WithMany()
.HasForeignKey(x => x.ApplicationSupersessionId)
.WillCascadeOnDelete(false);
Когда это должно было быть так:
HasMany(x => x.ApplicationSupersessions)
.WithOptional()
.HasForeignKey(x => x.ApplicationSupersessionId)
.WillCascadeOnDelete(false);
Я не уверен, в чем разница и является ли это ошибкой EF или нет?