在EF Code-first中,三个实体可以共享相同的连接表吗?

问题描述:

鉴于以下情况,实体框架代码优先命名/重命名连接或联接表。在EF Code-first中,三个实体可以共享相同的连接表吗?

public class User() { 
//all fields from Users table 
//... 
//Role collection from Roles table through UserRoleLinks table 
public List<Role> Roles { get; set; } 
} 

public class AppUser() { 
//subset of fields from Users through AppUsers View 
//... 
//Role collection from Roles table through UserRoleLinks table 
public List<Role> Roles { get; set; } 
} 

用户和APPUSER有以下配置项:

this.HasMany(e => e.Roles) 
    .WithMany().Map(m => { 
     m.MapLeftKey(a => a.Id, "Users_Id"); 
     m.MapRightKey(b => b.Id, "Roles_Id"); 
     m.ToTable("UserRoleLinks"); 
}); 

在运行时尝试使用AppUsers(DbSet <APPUSER>)时,我得到了下面的错误。

“无效的对象名称 'dbo.UserRoleLinks1'。” “无效的对象 名称'dbo.UserRoleLinks1'。”

看起来Code-first配置正在递增Join表名,因为它已经存在。

我该如何得到这个工作?有没有更好的方法来获取表格列的子集?

我认为这在EF中是不可能的(不仅在代码优先)。在EDMX中证明这是可行的之前,没有理由在代码优先的情况下尝试它。

这里的问题是AppUser是EF的新实体。现在,您在用户< - >角色和AppUser < - >角色之间具有M:N关系,并且您要将两个M:N关系映射到同一个结点表中。因为EF没有看到AppUser实际上只是用户表上的查看/查询,它可能将其标记为无效映射。

如果您只使用AppUser来获取列的子集,请将投影转换为linq查询中的自定义类型。