2011-02-14 68 views
1

鑑於以下情況,實體框架代碼優先命名/重命名連接或聯接表。在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表名,因爲它已經存在。

我該如何得到這個工作?有沒有更好的方法來獲取表格列的子集?

回答

0

我認爲這在EF中是不可能的(不僅在代碼優先)。在EDMX中證明這是可行的之前,沒有理由在代碼優先的情況下嘗試它。

這裏的問題是AppUser是EF的新實體。現在,您在用戶< - >角色和AppUser < - >角色之間具有M:N關係,並且您要將兩個M:N關係映射到同一個結點表中。因爲EF沒有看到AppUser實際上只是用戶表上的查看/查詢,它可能將其標記爲無效映射。

如果您只使用AppUser來獲取列的子集,請將投影轉換爲linq查詢中的自定義類型。

相關問題