asp.net – 与Entity Framework中的联结表有多对多的关系?
|
我试图在Entity Framework中创建一个多对多的关系(代码优先),根据以下帖子: Database design for limited number of choices in MVC and Entity Framework? 但是,我无法让它正常工作,而且我确信我的做法非常简单.这是我尝试过的图表: 联结表的要点是我需要在关系中有一个额外的属性Level,所以我不能只顾问顾问和程序之间的直接关系.我在设计器中手动添加了ConsultantProgramLink实体,然后分别向Program和Consultant添加了关联,选择为每个添加FK,然后将它们作为主键.但是,当我这样做时,它不能像我预期的那样工作: 如果我在顾问和程序之间建立了直接关联,那么我可以在我的代码中引用Consultant.Programs.但现在使用联结表不起作用.有没有办法解决这个问题,或者我是否总是需要通过交汇点属性(Consultant.ConsultantProgramLink.Programs)?在任何情况下,即使我尝试通过交汇处属性也无济于事.我可以在我的代码中做Consultant.ConsultantProgramLink,但是另一个点没有给我导航属性程序(由于某种原因它也变成了简单的程序,为什么?如果我最终可以访问它们,我可以重命名它们吗?) . 那么我做错了什么?为什么我不能通过代码中的点表示法访问属性? 解决方法将联结表建模为实体后,确实会失去顾问与程序之间的多对多关系.这就是它的工作原理.您将在联结表中具有直接的多对多关系或其他属性.不是都.如果您想要两者,您可以尝试在Consultant上创建自定义程序属性,并使用linq查询来获取相关程序:public IEnumerable<Program> Programs
{
get
{
return this.ConsultantProgramLinks.Select(l => l.Program);
}
}
这个例子也解释了你的上一个问题.您不能在ConsultantProgramLink上拥有Program属性,因为它是相关实体的集合,而不是单个实体(应该称为ConsultantProgramLinks). ConsultantProgramLink实体中的属性简单地称为Programbe,因为它表示单个实体而不是集合. 编辑: 如果您需要自动将每个程序与每个顾问相关联,则必须在创建新程序时强制执行该程序.将联结表暴露为单独的实体可能会让您轻松实现: var program = new Program();
...
context.Programs.AddObject(program);
var ids = from c in context.Consultants
select c.Id;
foreach (var id in ids)
{
var link = new ConsultantProgramLink
{
ConsultantId = id,Program = program
};
context.ConsultantProgramLinks.AddObject(link);
}
context.SaveChanges();
如果添加新顾问,则必须以相同方式创建指向所有程序的链接. 缺点是,如果你有1000个顾问,这个构造将创建1001个数据库插入,其中每个插入将在单独的往返数据库中执行.要避免它,唯一的选择是在Program表上使用存储过程或触发器. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – MVC3有条件地禁用Html.TextBoxFor()
- ASP.Net从CodeBehind打开浏览器中的新标签页
- ASP.NET奇怪的编译错误
- REST API是否区分大小写或非区分大小写?
- asp.net-core – .NET Core的静态代码分析工具
- asp.net – 可以通过VS2015在IIS中调试/运行aspnet5应用程序
- asp.net-mvc-2 – 如何在ASP.NET MVC2中为Html.LabelFor()添
- asp.net-mvc – 实体框架更新实体以及子实体(必要时添加/更
- ASP.NET MVC认为我的虚拟目录是一个控制器
- 重命名ASP.NET_SessionId
