实体框架不会使用超级密钥导入表

Ari*_*ian 2 c# linq-to-entities many-to-many entity-framework entity-framework-4

我有4张桌子:

但是当我创建一个实体框架模型时,为什么tblRoleInProfile不生成?

在此输入图像描述

我有一个想要将其转换为EF的Linq TO SQL模型,现在我的表格没有生成.我怎么解决这个问题?

更新1:

您认为我们有一些配置文件和一些角色.如果我们想要配置文件A有角色1插入一个记录tblRoleInProperty,如果我们想要配置文件B没有角色2(如果存在)删除它的记录tblRoleInProperty.我不想删除个人资料.另一个问题是选择新投影.任何人都可以指导我在EF中写这个查询:

var prs = from p in dc.tblProfiles
          join rp in dc.tblRoleInProfiles
              on p.ProfileId equals rp.ProfileId
          join r in dc.tblRoles
              on rp.RoleId equals r.RoleId
          select new
          {
              ProfileName = p.ProfileName,
              ProfileId = p.ProfileId,
              RoleName = r.RoleName,
              RoleId = r.RoleId
          };
Run Code Online (Sandbox Code Playgroud)

谢谢

Lad*_*nka 6

这就是EF的工作原理.EF是ORM工具 - 它试图隐藏持久性细节,并且多对多关系中的联结表正是您不希望在对象模型中看到的细节.

您可以将查询重写为:

var prs = from p in dc.tblProfiles
          from r in p.tblRoles
          select new
              {
                  ProfileName = p.ProfileName,
                  ProfileId = p.ProfileId,
                  RoleName = r.RoleName,
                  RoleId = r.RoleId
              };
Run Code Online (Sandbox Code Playgroud)

更新和删除关系也适用于导航属性.

将角色插入到个人资料中:

// Dummy objects so you do not need to load them from DB first. 
// These objects must exist in database
var p = new Profile { ProfileId = ... };
var r = new Role { RoleId = ... };

context.tblProfiles.Attach(p);
context.tblRoles.Attach(r);

p.tblRoles.Add(r);

context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

从个人资料中删除角色:

// Dummy objects so you do not need to load them from DB first. 
// These objects must exist in database
var p = new Profile { ProfileId = ... };
var r = new Role { RoleId = ... };

p.tblRoles.Add(r);

context.tblProfiles.Attach(p);
context.tblRoles.Attach(r);

p.tblRoles.Remove(r);
// another approach: 
// context.ObjectStateManager.ChangeRelationshipState(p, r, x => x.tblRoles, EntityState.Deleted);

context.SaveChanges();
Run Code Online (Sandbox Code Playgroud)