2013-01-25 113 views
1

我有一個抽象類UserProfile,它有一個子類Tenant,所以關係是1:1 - 一個'用戶'是一個'承租人'。實體框架代碼首先,與繼承的1:1關聯

這是以1:1的比例實現table-per-type繼承的正確方法嗎?

[Table("UserProfile")] 
public abstract class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    // ... 
} 

[Table("Tenant")] 
public class Tenant : UserProfile 
{ 
    public string PersonalDescription { get; set; } 
    // ... 

    // Navigation property on dependant end 
    public virtual UserProfile UserProfile { get; set; } 
} 
  • 上午我在放置導航屬性的關係的依賴到底是否正確?或者它有什麼結局呢?

  • 我是否還需要將Tenant類型的導航屬性在 UserProfile

  • 最後,我讀到,值得讓模型virtual中的每個屬性幫助EF進行變更跟蹤 - 這是否有必要?

+0

如果它是一種按表類型的方案,則不需要導航屬性。 Tenant不包含UserProfile,Tenant是UserProfile。 – SWeko

+0

好吧,但EF如何知道這是一個每桌類型的情況?我是否通過將派生類放在派生類上來明確地強制執行它? – MattSull

+1

嗯,是的。 EF應該能夠從'Tenant'表中獲取'Tenant'字段的值,以及從'UserProfile'表中的'UserProfile'繼承的字段。看起來神奇,但它的作品,至少對我來說:) – SWeko

回答

1

在每種類型的表情中,您不需要導航屬性。 Tenant不包含UserProfile,Tenant是UserProfile。

EF應該能夠從Tenant表中獲取租戶字段的值,並從UserProfile表中繼承UserProfile的字段。看起來很神奇,但它起作用,至少對我來說:)

至於DbSets,如果您需要直接使用Tenant集合,您可以添加Tenants DbSet。這將使你做:

myContext.Tenants.Where(t => ... t.PersonalDescription ... t.UserId ...) 

與相當長,少發現

myContext.UserProfiles.OfType<Tenant>.Where(t => ....) 

我個人的偏好是完全不使用宣佈DbSets,並直接使用Set<T>()方法一個包裝存儲庫,它揭示了GetByKey,Update等方法,但這是一個有趣的問題。

+0

謝謝你,我不確定這是否被允許,但我有點絕望的回答/意見。如果你願意看看這個問題http://stackoverflow.com/questions/14477961/database-design-sql-ce-in-mvc-4-project-using-entity-framework-code-first-a我我真的很感激它。 – MattSull