如何通过实体框架中的外键表连接两个表?

时间:2017-02-02 20:35:45

标签: entity-framework linq

我正在尝试通过linq中的外键表连接两个表。 这两张桌子是 Items和Classes以及外键表是ItemClasses(ItemId,ClassId)。

我的上下文没有外键表的DBSet,当我尝试添加它时,我得到模型创建错误。

当我看到错误时,我注意到此代码引用了外键表

modelBuilder.Entity<Classes>()
            .HasMany(e => e.Items)
            .WithMany(e => e.Classes)
            .Map(m => m.ToTable("ItemClasses").MapLeftKey("ClassId").MapRightKey("ItemId"));

所以看起来我应该能够通过课程引用这些项目,但是我如何加入这些表?

我想做这样的事情

            query = from ig in myCtx.Items.AsNoTracking()                          
                         //join di in myCtx.ItemClasses.AsNoTracking() on ig.Id equals di.ClassId
                         join c in myCtx.Classes.AsNoTracking() on di.ClassId equals c.Id
                         join dd in myCtx.SalesAssociates.AsNoTracking() on dd.Id equals ig.SalesAssociateId

当fk表不在我的上下文中但是在其中一个表中引用时,如何进行连接?

1 个答案:

答案 0 :(得分:1)

首先,您遇到配置错误。使用HasMany / WithMany,您实际上正在配置自动“链接”表,所以

m.ToTable("Classes")

应该是

m.ToTable("ItemClasses")

或者您希望在数据库中命名该表的确切程度。

其次,在使用EF时,use navigation properties rather than joins总是首选。如果与自动链接表有many-to-many关系,则必须使用导航属性。 EF将为您提供必要的连接。

所以不要加入你的意志就会使用这样的东西:

query = from ig in myCtx.Items.AsNoTracking()                          
        from c in ig.Classes
        ...