栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

首先创建代码,多对多创建,并在关联表中添加其他字段

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

首先创建代码,多对多创建,并在关联表中添加其他字段

用自定义的联接表创建多对多关系是不可能的。在多对多关系中,EF内部管理和隐藏联接表。这是一个在模型中没有Entity类的表。要使用具有其他属性的联接表,您实际上必须创建两个一对多关系。它可能看起来像这样:

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; }}

例如,如果现在要查找带有

LastName
=“ Smith” 的成员的所有注释,则可以编写如下查询:

var commentsOfMembers = context.Members    .Where(m => m.LastName == "Smith")    .SelectMany(m => m.MemberComments.Select(mc => mc.Comment))    .ToList();

… 要么 …

var commentsOfMembers = context.MemberComments    .Where(mc => mc.Member.LastName == "Smith")    .Select(mc => mc.Comment)    .ToList();

或创建一个名称为“ Smith”(假设有多个)的成员及其注释的列表,您可以使用投影:

var membersWithComments = context.Members    .Where(m => m.LastName == "Smith")    .Select(m => new    {        Member = m,        Comments = m.MemberComments.Select(mc => mc.Comment)    })    .ToList();

如果要查找成员

MemberId
= 1的所有注释:

var commentsOfMember = context.MemberComments    .Where(mc => mc.MemberId == 1)    .Select(mc => mc.Comment)    .ToList();

现在,您还可以按联接表中的属性进行过滤(在多对多关系中这是不可能的),例如:过滤成员1中属性为99的所有注释

Something

var filteredCommentsOfMember = context.MemberComments    .Where(mc => mc.MemberId == 1 && mc.Something == 99)    .Select(mc => mc.Comment)    .ToList();

由于延迟加载,事情可能会变得更容易。如果您已加载

Member
,则无需显式查询即可获得注释:

var commentsOfMember = member.MemberComments.Select(mc => mc.Comment);

我想延迟加载会自动在后台获取评论。

编辑

仅出于娱乐目的,在此模型中还提供了一些示例,说明如何添加实体和关系以及如何删除它们:

1)创建一个成员和该成员的两个评论:

var member1 = new Member { FirstName = "Pete" };var comment1 = new Comment { Message = "Good morning!" };var comment2 = new Comment { Message = "Good evening!" };var memberComment1 = new MemberComment { Member = member1, Comment = comment1,        Something = 101 };var memberComment2 = new MemberComment { Member = member1, Comment = comment2,        Something = 102 };context.MemberComments.Add(memberComment1); // will also add member1 and comment1context.MemberComments.Add(memberComment2); // will also add comment2context.SaveChanges();

2)添加member1的第三条评论:

var member1 = context.Members.Where(m => m.FirstName == "Pete")    .SingleOrDefault();if (member1 != null){    var comment3 = new Comment { Message = "Good night!" };    var memberComment3 = new MemberComment { Member = member1, Comment = comment3, Something = 103 };    context.MemberComments.Add(memberComment3); // will also add comment3    context.SaveChanges();}

3)创建新成员并将其与现有评论2关联:

var comment2 = context.Comments.Where(c => c.Message == "Good evening!")    .SingleOrDefault();if (comment2 != null){    var member2 = new Member { FirstName = "Paul" };    var memberComment4 = new MemberComment { Member = member2, Comment = comment2, Something = 201 };    context.MemberComments.Add(memberComment4);    context.SaveChanges();}

4)在现有的member2和comment3之间创建关系:

var member2 = context.Members.Where(m => m.FirstName == "Paul")    .SingleOrDefault();var comment3 = context.Comments.Where(c => c.Message == "Good night!")    .SingleOrDefault();if (member2 != null && comment3 != null){    var memberComment5 = new MemberComment { Member = member2, Comment = comment3, Something = 202 };    context.MemberComments.Add(memberComment5);    context.SaveChanges();}

5)再次删除此关系:

var memberComment5 = context.MemberComments    .Where(mc => mc.Member.FirstName == "Paul"        && mc.Comment.Message == "Good night!")    .SingleOrDefault();if (memberComment5 != null){    context.MemberComments.Remove(memberComment5);    context.SaveChanges();}

6)删除member1及其与注释的所有关系:

var member1 = context.Members.Where(m => m.FirstName == "Pete")    .SingleOrDefault();if (member1 != null){    context.Members.Remove(member1);    context.SaveChanges();}

该删除的关系

MemberComments
也因为之间的一个一对多的关系
Member
MemberComments
与之间
Comment
MemberComments
是建立与惯例级联删除。之所以如此,是因为将
MemberId
CommentId
in
MemberComment
检测为
Member
Comment
导航属性的外键属性,并且由于FK属性的类型为不可为空
int
,因此需要这种关系,最终导致级联删除设置。我认为在这种模型中是有道理的。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/576337.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号