Структура сущностей:Ошибка самостоятельного соединения

StackOverflow https://stackoverflow.com//questions/24017199

Вопрос

У меня есть следующий класс:

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 таблицу, и я пытаюсь скорректировать данные, которые в настоящее время выглядят следующим образом:

enter image description here

Но мне нужны приложения 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;:

enter image description here

Это было полезно?

Решение

Мне удалось решить эту проблему.У меня в конфигурации были неправильно настроены отношения.

У меня было это:

HasOptional(x => x.ApplicationSupersessions)
    .WithMany()
    .HasForeignKey(x => x.ApplicationSupersessionId)
    .WillCascadeOnDelete(false);

Когда это должно было быть так:

HasMany(x => x.ApplicationSupersessions)
    .WithOptional()
    .HasForeignKey(x => x.ApplicationSupersessionId)
    .WillCascadeOnDelete(false);

Я не уверен, в чем разница и является ли это ошибкой EF или нет?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top