2013-07-31 77 views
0

我不知道是否可以將子類屬性映射到基類表。說我有兩個班(縮短):EF代碼優先 - 將子類屬性映射到基類表

public abstract class User 
{ 
    [Key] 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    // other properties... 
} 

public class Customer : User 
{ 
    public int ShopId { get; set; } 

    public virtual Shop Shop { get; set; } 

    // other properties... 
} 

我使用TPT(每種類型的表)繼承(這意味着兩個表 - 用戶和客戶)。由於某些原因,我希望在用戶表中有ShopId屬性,但在Customer表中有Customer類中的所有其他屬性。這甚至可能嗎?

在User表中有ShopId列允許我們在用戶名和ShopId上創建唯一索引(應用程序是多租戶的,所以我們不需要全球唯一的用戶名,只有商店級的唯一用戶名)。

+0

小號o爲什麼不能將shopId放入用戶? ef不會爲摘要創建表格。 –

+0

這是使用TPT時。此外,我不想從'用戶'和'商店'有任何關係。 'User'與'Shop'無關,只有'Customer'。 – MrHenkey

回答

0

這是你在找什麼?

UserBase.cs

public abstract class UserBase 
{ 
    public int UserId { get; set; } 
    public string Username { get; set; } 
    public int ShopId { get; set; } 
    public virtual Shop Shop { get; set; } 
} 

User.cs

public class User : UserBase 
{ 
    // user specific properties... 
} 

Customer.cs

public class Customer : UserBase 
{ 
    // customer specific properties... 
} 

UserDbContext.cs

public class UserDbContext : DbContext 
{ 
    ... 

    protected override OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // if you want users and customers to be shop specific 
     modelBuilder.Entity<UserBase>.HasKey(x => new { x.UserId, x.ShopId }); 

     // if you only want users to be shop specific uncomment below and remove above 
     //modelBuilder.Entity<User>.HasKey(x => new { x.UserId, x.ShopId }); 
    } 
} 
+0

不完全。我正在尋找一個解決方案,無需從用戶(基類)到Shop(應用程序級別)的關係。我的意思是,既然與Shop的關係只對客戶有效,我更願意在Customer類中擁有「ShopId」和「Shop」屬性。但是,爲了確保數據庫的完整性,最好在User表中有ShopId列。映射到屬性的列僅在Customer類中可見。 – MrHenkey

+0

只需將'ShopId'屬性添加到'User'類,然後將導航屬性添加到'Shop'。 – shuniar