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

时间:2011-02-14 14:18:45

标签: entity-framework 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; }
}

User和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&lt; AppUser&gt;)。

  

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

似乎代码优先配置正在递增Join表名,因为已存在。

我怎样才能使这个工作?有没有更好的方法来获取表的列的子集?

1 个答案:

答案 0 :(得分:0)

我认为在EF中根本不可能(不仅仅是代码优先)。直到你在EDMX中证明这是可能的,没有理由在代码优先尝试它。

这里的问题是AppUser是EF的新实体。现在,用户&lt; - &gt;之间存在M:N关系。角色和AppUser&lt; - &gt;角色并且您希望将M:N关系映射到同一个联结表中。因为EF没有看到AppUser实际上只是在User表之上的View / Query,所以它可能会将其标记为无效映射。

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