And*_*ers 7 asp.net junction-table entity-framework-4 asp.net-mvc-3
我正在尝试在Entity Framework(代码优先)中创建多对多关系,根据以下帖子:MVC和Entity Framework中有限数量的选择的数据库设计?
但是,我无法让它正常工作,而且我确信我的做法非常简单.这是我尝试过的图表:

联结表的要点是我需要在关系中有一个额外的属性Level,所以我不能只顾问顾问和程序之间的直接关系.我在设计器中手动添加了ConsultantProgramLink实体,然后分别向Program和Consultant添加了关联,选择为每个添加FK,然后将它们作为主键.但是,当我这样做时,它不能像我预期的那样工作:
如果我在顾问和程序之间建立了直接关联,那么我可以在我的代码中引用Consultant.Programs.但现在使用联结表不起作用.有没有办法解决这个问题,或者我是否总是需要通过交汇点属性(Consultant.ConsultantProgramLink.Programs)?在任何情况下,即使我尝试通过交汇处属性也无济于事.我可以在我的代码中做Consultant.ConsultantProgramLink,但是另一个点没有给我导航属性程序(由于某种原因它也变成了简单的程序,为什么?如果我最终可以访问它们,我可以重命名它们吗?) .
那么我做错了什么?为什么我不能通过代码中的点表示法访问属性?
Lad*_*nka 11
一旦您将联结表建模为实体,您确实会在Consultant和之间失去直接的多对多关系Program.这就是它的工作原理.您将在联结表中具有直接的多对多关系或其他属性.不是都.如果你想要两个,你可以尝试创建自定义Programs属性Consultant并使用linq查询来获取相关的程序:
public IEnumerable<Program> Programs
{
get
{
return this.ConsultantProgramLinks.Select(l => l.Program);
}
}
Run Code Online (Sandbox Code Playgroud)
这个例子也解释了你的上一个问题.您不能拥有Program属性,ConsultantProgramLink因为它是相关实体的集合,而不是单个实体(应该被调用ConsultantProgramLinks).ConsultantProgramLink实体中的属性被简单地调用,Program因为它表示单个实体而不是集合.
编辑:
如果您需要将每个Program都自动关联,则Consultant必须在创建新实施时强制执行Program.将联结表暴露为单独的实体可能会让您轻松实现:
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();
Run Code Online (Sandbox Code Playgroud)
如果添加新内容Consultant,则必须以相同方式创建指向所有程序的链接.
缺点是,如果你有1000个顾问,这个构造将创建1001个数据库插入,其中每个插入将在单独的往返数据库中执行.要避免它,唯一的选择是在Program表上使用存储过程或触发器.
| 归档时间: |
|
| 查看次数: |
6113 次 |
| 最近记录: |