簡體   English   中英

具有多個不同類型的多個父項之一的實體

[英]Entity having one of multiple parents, which are different types

我目前正在與MySql數據庫結合使用C#EF MVC項目,並且正在嘗試通過代碼優先方法(啟用遷移)來設置數據庫架構。 對於我的示例,我將模型簡化為以下所示的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
  // ...
}

為了確保正確映射關系,我還在DbContext上使用了EF Fluent Api。

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();
  }
}

我遇到的問題是,當我嘗試將包含MessageContentMessage添加到數據庫時,我得到:

無法添加或更新子行:外鍵約束失敗(“ DbName”。“ MessageContent”,約束“ FK_MessageContent_CorrectedContent_MessageContentId” FOREIGN KEY(“ MessageContentId”)參考“ CorrectedContent”(“ CorrectedContentId”)在更新級聯時刪除級聯)

我嘗試將兩個實體都放在“ withOptional”上,但是那沒有用,我還嘗試了使用MessageCorrectedContent的共同接口。

所以Message應該有一個一到一或零關系MessageContentCorrectedContent也有一到一或零以關系MessageContentMessage有一到一或零與CorrectedContent

我當前的解決方案:

因為我的數據所來自的XSD(並發送xml文件)太復雜而無法轉換為合適的數據庫模型,所以我選擇了一個不太理想的解決方案,其中只有兩個類,如下所示。

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

  public virtual MessageContent MessageContent { get; set; }
}

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

  public virtual Message Message { get; set; }

  [Required, Column(TypeName = "text")]
  public string XMLString { get; set; }

  [Required]
  public MessageType Type { get; set; }
}

public enum MessageType
{
  Correction,
  Normal,
  // more options ...
}

在模型中,我只打開始終為Message類型的接收到的XML的第一個元素。 然后,我尋找子元素並獲取其類型為MessageType XMLString屬性以string表示形式包含此子級。

我知道這是一個糟糕的設計解決方案,但它對我的應用程序正常工作。 我使用前端提供給我的XSD(類),因此我只需要將XMLString解析為XSD類。

始終歡迎任何更好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM