使用自定義連接表創建多對多關係
在實體框架中,多對多關係通常涉及一個內部管理的隱藏連接表。但是,在某些情況下,您可能需要一個具有附加屬性的自定義連接表。
多對多關係的局限性
不幸的是,使用 Fluent API 無法創建具有自定義連接表的多對多關係。 EF 需要一個隱藏的、內部管理的連接表來實現多對多關係。
替代方法
相反,要使用具有附加屬性的自定義連接表,您可以創建兩個單獨的一對多關係,每個實體到連接表各一個。
示例
考慮以下場景:
<code class="language-csharp">public class Member { public int MemberID { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public virtual ICollection<MemberComment> MemberComments { get; set; } } public class Comment { public int CommentID { get; set; } public string Message { get; set; } public virtual ICollection<MemberComment> MemberComments { get; set; } } public class MemberComment { [Key, Column(Order = 0)] public int MemberID { get; set; } [Key, Column(Order = 1)] public int CommentID { get; set; } public virtual Member Member { get; set; } public virtual Comment Comment { get; set; } public int Something { get; set; } public string SomethingElse { get; set; } }</code>
在此模型中,MemberComment
用作具有附加屬性 Something
和 SomethingElse
的自定義連接表。
查詢關係
要查詢這些關係,您可以使用 LINQ 表達式:
<code class="language-csharp">// 查找 LastName = "Smith" 的成员的所有评论 var commentsOfMembers = context.Members .Where(m => m.LastName == "Smith") .SelectMany(m => m.MemberComments.Select(mc => mc.Comment)) .ToList();</code>
<code class="language-csharp">// 查找 LastName = "Smith" 的所有成员及其评论 var membersWithComments = context.Members .Where(m => m.LastName == "Smith") .Select(m => new { Member = m, Comments = m.MemberComments.Select(mc => mc.Comment) }) .ToList();</code>
此方法的優點
這種替代方法具有以下幾個優點:
總結
雖然 EF 不直接支持具有自定義連接表的多對多關係,但此處描述的替代方法提供了一種靈活的方式來處理數據模型中的此類關係。此方法提供了可定制性、可查詢性和延遲加載的優點,使您可以滿足您的特定需求。
以上是如何在實體框架中與自定義聯接表實現多一關係?的詳細內容。更多資訊請關注PHP中文網其他相關文章!