在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查询中的自定义类型。