【问题标题】:Many to many relationship with junction table in Entity Framework?与实体框架中的联结表的多对多关系?
【发布时间】:2011-07-22 01:09:58
【问题描述】:

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

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

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

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

那么我做错了什么?为什么我无法通过代码中的点符号访问属性?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 entity-framework-4 junction-table


    【解决方案1】:

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

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

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

    如果您添加新的Consultant,您将必须以相同的方式创建指向所有程序的链接。

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

    【讨论】:

    • 好的,谢谢,这是有道理的。但我想知道我是否在想这一切都错了?我不知道如何用这个来做我想做的事:
    • 假设我创建了一个新顾问。我希望该顾问在其 Programs 属性中拥有所有程序。然后我希望用户能够为每一个设置熟练程度。但是1:如何将程序表中的所有程序分配给每个顾问? 2:如果我将新程序添加到程序表(我希望能够这样做)怎么办?你看到我需要什么了吗? Adobe Illustrator、MS Word 等程序的列表,并且此列表应该是可扩展的。但是每个顾问应该总是在他们的程序属性中“拥有”所有程序,并且只设置编辑配置文件的级别......
    • 非常感谢,我很感激,我无法理解......!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2021-06-16
    相关资源
    最近更新 更多