我正在尝试通过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表不在我的上下文中但是在其中一个表中引用时,如何进行连接?
答案 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
...