[英]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();
}
}
我遇到的問題是,當我嘗試將包含MessageContent
的Message
添加到數據庫時,我得到:
無法添加或更新子行:外鍵約束失敗(“ DbName”。“ MessageContent”,約束“ FK_MessageContent_CorrectedContent_MessageContentId” FOREIGN KEY(“ MessageContentId”)參考“ CorrectedContent”(“ CorrectedContentId”)在更新級聯時刪除級聯)
我嘗試將兩個實體都放在“ withOptional”上,但是那沒有用,我還嘗試了使用Message
和CorrectedContent
的共同接口。
所以Message
應該有一個一到一或零關系MessageContent
, CorrectedContent
也有一到一或零以關系MessageContent
和Message
有一到一或零與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.