Сущность, имеющая одного из нескольких родителей, которые бывают разных типов - PullRequest
0 голосов
/ 08 июля 2019

В настоящее время я работаю над проектом C # EF MVC в сочетании с базой данных MySql и пытаюсь настроить схему базы данных с помощью подхода, основанного на коде (с включенными миграциями).Для моего примера я упростил свою модель до 3 классов, показанных ниже:

public class Message
{
  [Key]
  public int MessageId { get; set; }
  // Some properties ...

  // There will always be one filled in and not the other
  public virtual CorrectedContent CorrectedContent { get; set; }
  public virtual MessageContent MessageContent { get; set; }
}

public class CorrectedContent
{
  [Key]
  public int CorrectedContentId { get; set; }

  public virtual Message Message { get; set; }
  // ...
  public MessageContent MessageContent { get; set; }  // Nullable
}

public class MessageContent
{
  [Key]
  public int MessageContentId { get; set; }

  public virtual Message Message { get; set; }
  public virtual CorrectedContent CorrectedContent
  // ...
}

Чтобы убедиться, что отношения были отображены правильно, я также использовал EF Fluent Api на моем DbContext.

public class TestContext: DbContext
{
  public TestContext(): base("TestContext") { }
  // My DbSets and such ...

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<CorrectedContent>()
      .HasOptional(x => x.MessageContent)
      .WithRequired(y => y.CorrectedContent)
      .WillCascadeOnDelete();

    modelBuilder.Entity<Message>()
      .HasOptional(x => x.MessageContent)
      .WithRequired(y => y.Message)
      .WillCascadeOnDelete();

    modelBuilder.Entity<Message>()
      .HasOptional(x => x.CorrectedContent)
      .WithRequired(y => y.Message)
      .WillCascadeOnDelete();
  }
}

У меня возникает проблема, когда я пытаюсь добавить Message с MessageContent в свою базу данных, я получаю:

Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется ("DbName "." MessageContent ", ОБЕСПЕЧИВАЕТ" FK_MessageContent_CorrectedContent_MessageContentId "FOREIGN KEY (" MessageContentId ") ССЫЛКИ" CorrectedContent "(" CorrectedContentId ") НА УДАЛИТЬ CASCADE * * *

на 1013 * * * * * *1012* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1012* * * * * * *.«withOptional», но это не сработало, я также пытался работать с обоюдным интерфейсом для
Message и CorrectedContent.

Так что Message должен иметь один к одному илиНулевое отношение к MessageContent, CorrectedContent также имеет отношение один к одному или нулю с MessageContent, а Message имеет отношение один к одному или нулю с CorrectedContent.

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