ReVolly
ReVolly

Reputation: 126

Split table in Entity Framework into multiple entities

Here's the problem. I have table User which have quite a few fields. What I want to do is split this table into multiple entities like this:

User
  -> GeneralDetails
  -> CommunicationDetails
  -> Address

etc.

All goes well when extracting some fields from User into GeneralDetails. However, when I try to do the same thing for CommunicationDetails EF blows up and require to establish one-to-one relationship between GeneralDetails and CommunicationDetails.

Sample entities definition:

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; }
}

Sample mapping:

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");

Why on earth EF want this relationship? Is there any way this could be solved?

Upvotes: 0

Views: 2509

Answers (1)

Aron
Aron

Reputation: 15772

The correct way to actually do this is by Complex Types rather than entities. Its actually a more common problem than you think.

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

Upvotes: 1

Related Questions