具有多个不同类型的多个父项之一的实体

时间:2019-07-08 12:27:44

标签: c# entity-framework

我目前正在与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();
  }
}

我遇到的问题是,当我尝试将具有Message的{​​{1}}添加到数据库时,我得到:

  

无法添加或更新子行:外键约束失败   (“ DbName”。“ MessageContent”,约束   “ FK_MessageContent_CorrectedContent_MessageContentId”外键   (“ MessageContentId”)参考“ CorrectedContent”   (“ CorrectedContentId”)在更新级联上删除级联)

我曾尝试将两个实体都置于“ withOptional”上,但这没有用,我还尝试为MessageContentMessage都使用一个共同的接口。

因此,CorrectedContentMessage应该是一对一或零的关系,MessageContent与{也应该是一对一或零的关系{1}}和CorrectedContentMessageContent一对一或零。

1 个答案:

答案 0 :(得分:0)

我当前的解决方案:

由于我的数据所来自的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的第一个元素。然后,我寻找子元素并获取其类型为MessageTypeXMLString属性以string表示形式包含此子级。

我知道这是一个设计不良的解决方案,但它可以很好地适用于我的应用程序。我使用前端提供给我的XSD(类),因此我只需要将XMLString解析为XSD类。

始终欢迎任何更好的解决方案。