2015-06-03 194 views
2

我正面臨使用EF的問題。我有以下情況:實體框架映射實體到多個表?

表用戶:用戶名,密碼,角色ID,IsActive,CreatedDate,ActivedDate

表管理:用戶名,姓名

表職員:用戶名,姓名,職務,電話

從這個數據庫架構,我想通過生成合並表中的數據如下實體:

public class User 
{ 
    [Key] 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public int RoleId { get; set; } 
    public bool IsActive { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public DateTime ActivedDate { get; set; } 

    public string Name { get; set; } 
    public string Phone { get; set; } 
    public string Position { get; set; } 

    [ForeignKey("RoleId")] 
    public Role Role { get; set; } 
} 

配置類:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>() 
      .Map(map => 
      { 
       map.Properties(p => new 
       { 
        p.Username, 
        p.Password, 
        p.RoleId, 
        p.IsActive, 
        p.CreatedDate, 
        p.ActivedDate 
       }); 
       map.ToTable("User"); 
      }) 
      .Map(map => 
      { 
       map.Properties(p => new 
       { 
        p.Username, 
        p.Name 
       }); 
       map.ToTable("Admin"); 
      }).Map(map => 
      { 
       map.Properties(p => new 
       { 
        p.Username, 
        p.Name, 
        p.Phone, 
        p.Position 
       }); 
       map.ToTable("Staff"); 
      }); 

     base.OnModelCreating(modelBuilder); 
    } 

我測試過,但預期它不工作。我總是收到此消息:

'User'類型的屬性只能映射一次。非關鍵屬性'名稱'被映射多次。確保Properties方法只指定每個非關鍵屬性一次。

我錯過了什麼嗎?

+0

也許有人有一個實際的解決方案 - 但我*認爲*你將不得不走與你一樣的道路'角色'(外鍵,...) – Carsten

+0

用戶是否繼承了你用戶類的sers?或者你的代碼對於所有這些實體只有一個用戶?你可以在這裏查找繼承策略:http://blogs.msdn.com/b/alexj/archive/2009/04/15/tip-12-choosing-an-inheritance-strategy.aspx我看到你有一個角色實體,我不認爲我會如何解決它......我會有一個基礎人員,讓用戶,管理員和工作人員繼承這個抽象類。然後我會使用Table Per Type(TPT)來避免我的數據庫中有多個空值。 – jonas

回答

0

的問題是,這兩個Name S IN Admin當然Staff不能同時在User映射到一個Name屬性。

但你可以有兩個不同名稱的屬性,並在兩個表都映射到相同的列名:

變化User

public class User 
{ 
    [Key] 
    public string Username { get; set; } 
    ... 
    public string AdminName { get; set; } 
    public string StaffName { get; set; } 
    ... 
} 

和映射片段:

.Map(map => 
{ 
    map.Properties(p => new 
    { 
     p.Username, 
     p.AdminName 
    }); 
    map.Property(p => p.AdminName).HasColumnName("Name"); 
    map.ToTable("Admin"); 
}).Map(map => 
{ 
    map.Properties(p => new 
    { 
     p.Username, 
     p.StaffName, 
     p.Phone, 
     p.Position 
    }); 
    map.Property(p => p.StaffName).HasColumnName("Name"); 
    map.ToTable("Staff"); 
});