2013-07-23 49 views
0

問題出在這裏。我有表用戶其中有很多領域。我想要做的就是這個表拆分成多個實體是這樣的:將Entity Framework中的表拆分爲多個實體

User 
    -> GeneralDetails 
    -> CommunicationDetails 
    -> Address 

etc. 

所有的用戶提取某些字段爲GeneralDetails時順利。然而,當我嘗試做同樣的事情CommunicationDetails EF爆炸並需要建立一對一之間的關係一般詳細CommunicationDetails

樣品實體的定義:

public class User { 
    public int UserId { get; set; } 

    public string SomeField1 { get; set; } 
    public int SomeField2 { get; set; } 

    public virtual GeneralDetails GeneralDetails { get; set; } 
    public virtual CommunicationDetails CommunicationDetails { get; set; } 
    public virtual Address Address { get; set; } 
} 

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

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 

    public virtual User User { get;set; } 
} 

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

    public string Phone { get; set; } 
    public string DeviceToken { get; set; } 

    public virtual User User { get;set; } 
} 

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

    public string City { get; set; } 
    public string Country { get; set; } 
    public string Street { get; set; } 

    public virtual User User { get;set; } 
} 

樣品映射:

modelBuilder.Entity<User>(). 
      HasRequired(user => user.GeneralDetails). 
      WithRequiredPrincipal(details => details.User); 

modelBuilder.Entity<User>(). 
      HasRequired(user => user.CommunicationDetails). 
      WithRequiredPrincipal(details => details.User); 

modelBuilder.Entity<User>(). 
      HasRequired(user => user.Address). 
      WithRequiredPrincipal(details => details.User); 

modelBuilder.Entity<User>().ToTable("Users"); 
modelBuilder.Entity<GeneralDetails>().ToTable("Users"); 
modelBuilder.Entity<Address>().ToTable("Users"); 

爲什麼地球上EF希望這種關係?有什麼辦法可以解決這個問題嗎?

+0

這似乎是你的用戶表已經正確歸一化,一旦適當標準化意味着你應該能夠讓他們作爲一個實體。事實上你把這張表分成三份,表明你可能只想在你的數據庫中使用三張不同的表格。這只是一個建議,如果我錯了,請糾正我。 – Srb1313711

+1

@ Srb1313711我不同意。 OR/M的一個要點是將對象映射到數據庫。對象的形狀應該由應用程序域驅動,而數據庫應該是數據庫形狀的。案例和觀點,數據庫中的多對多關係需要一個關聯表,它通常不應該映射到應用程序中的類。 – Aron

回答

1

實際做到這一點的正確方法是通過複雜類型而不是實體。它實際上比您想象的更普遍的問題。

public class MyDbContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelbuilder.ComplexType<CommunicationDetails>(); 
     modelbuilder.ComplexType<GeneralDetails>(); 
     modelbuilder.ComplexType<Address>(); 
     modelbuilder.Entity<User>().ToTable("Users"); 
    } 
} 
+0

你有這個完整的例子嗎? –

相關問題