gpt4 book ai didi

asp.net - Entity Framework 中与联结表的多对多关系?

转载 作者:行者123 更新时间:2023-12-02 11:19:39 26 4
gpt4 key购买 nike

根据以下帖子,我正在尝试在 Entity Framework 中创建多对多关系(代码优先):Database design for limited number of choices in MVC and Entity Framework?

但是,我无法让它正常工作,而且我确信我正在以错误的方式做一些非常简单的事情。这是我尝试过的图表:

enter image description here

连接表的要点是,我需要在关系中拥有一个额外的属性 Level,因此我不能只在顾问和项目之间建立直接关系。我在设计器中手动添加了 ConsultantProgramLink 实体,然后分别添加了 Program 和 Consultant 的关联,选择为每个添加 FK,然后将它们设为主键。但是当我这样做时,它并没有像我预期的那样工作:

如果我在顾问和程序之间建立了直接关联,我就可以在我的代码中引用顾问.程序。但现在这不适用于联结表。有什么方法可以解决这个问题,还是我总是必须通过连接属性(Consultant.ConsultantProgramLink.Programs)?无论如何,即使我确实尝试通过交界处属性,它也无济于事。我可以在代码中执行 Consultant.ConsultantProgramLink,但另一个点没有给我导航属性 Programs(由于某种原因,它也变成了简单的 Program,为什么?如果我最终能够访问它们,我可以重命名它们吗?) .

那我做错了什么?为什么我无法在代码中通过点表示法访问属性?

最佳答案

一旦将联结表建模为实体,您确实会失去ConsultantProgram之间的直接多对多关系。这就是它的工作原理。您将在联结表中拥有直接的多对多关系或附加属性。不是都。如果您想要两者,您可以尝试在 Consultant 上创建自定义 Programs 属性,并使用 linq 查询来获取相关程序:

public IEnumerable<Program> Programs
{
get
{
return this.ConsultantProgramLinks.Select(l => l.Program);
}
}

这个例子也是对你上一个问题的解释。您不能在 ConsultantProgramLink 上拥有 Program 属性,因为它是相关实体的集合,而不是单个实体(应称为 ConsultantProgramLinks)。 ConsultantProgramLink 实体中的属性简称为 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();

如果您添加新的顾问,您将必须以相同的方式创建指向所有计划的链接。

缺点是,如果您有 1000 名顾问,此构造将创建 1001 个数据库插入,其中每个插入将在数据库的单独往返中执行。为了避免这种情况,唯一的选择是在程序表上使用存储过程或触发器。

关于asp.net - Entity Framework 中与联结表的多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5418155/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com