使用自定义连接表创建多对多关系
在实体框架中,多对多关系通常涉及一个内部管理的隐藏连接表。但是,在某些情况下,您可能需要一个具有附加属性的自定义连接表。
多对多关系的局限性
不幸的是,使用 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中文网其他相关文章!