我目前正在与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”上,但这没有用,我还尝试为MessageContent
和Message
都使用一个共同的接口。
因此,CorrectedContent
与Message
应该是一对一或零的关系,MessageContent
与{也应该是一对一或零的关系{1}}和CorrectedContent
与MessageContent
一对一或零。
答案 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的第一个元素。然后,我寻找子元素并获取其类型为MessageType
。 XMLString
属性以string
表示形式包含此子级。
我知道这是一个设计不良的解决方案,但它可以很好地适用于我的应用程序。我使用前端提供给我的XSD(类),因此我只需要将XMLString解析为XSD类。
始终欢迎任何更好的解决方案。