1

鉴于以下情况,Entity Framework 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<AppUser>) 时出现以下错误。

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

似乎代码优先配置正在增加连接表名称,因为一个已经存在。

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

4

1 回答 1

0

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

这里的问题是 AppUser 是 EF 的新实体。现在您在 User <-> Roles 和 AppUser <-> Roles 之间有 M:N 关系,并且您希望将这两个 M:N 关系映射到同一个联结表中。因为 EF 没有看到 AppUser 实际上只是 User 表顶部的 View/Query 它可能会将其标记为无效映射。

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

于 2011-02-14T14:51:44.507 回答