I have done a lot of post on Entity
Framework Code First which includes some simple tips and tricks to more
complex scenarios of mapping relationship and here are some of those
post if you want to read them.
Entity Framework Tutorial
However recently I was helping a friend
of mine to understand Entity Framework modelling for a legacy system.
Since the schema is already defined it becomes a bit difficult to create
a rich domain model keeping the model in your design. The other thing I
have seen is that people simply follow the schema and let schema
dictating what your domain is, which in my opinion is not correct.
Anyways, after some discussion I
realized that they are not taking advantage of Entity Splitting in
Entity Framework, so I thought about blogging it.
Entity Splitting:-
In this scenario there is a single entity or domain object but the data
is stored in multiple tables with a one to one relationship. For
example lets say the domain is a fitness/health industry
and you have customer table which stores basic information like first
name, last name, DOB in the customer table and other vital stats like
resting heat beat,blood type,cholesterol level, blood pressure, Sugar
level etc. in their health information table. However in your domain
model the customer object is composed of both information.
Lets see this in action.
Customer.cspublic class Customer { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTime DOB { get; set; } public int RestingHeartBeat { get; set; } public string BloodType { get; set; } public decimal Cholesterol { get; set; } public string BloodPressure { get; set; } }
So this is my domain object which
represents the whole customer object however in the legacy system some
information is stored in the Customer table and some in the VitalStats
table.
And lets write the configuration for
customer in which we will split the entity into two different tables
using the Map and ToTable function as shown below.
CustomerConfiguration.cspublic class CustomerConfiguration : EntityTypeConfiguration<Customer> { public CustomerConfiguration() { this.Map(c => { c.Properties(p => new { p.Id, p.FirstName, p.LastName, p.DOB }); c.ToTable("Customer"); }) .Map(v => { v.Properties(p => new { p.Id, p.BloodPressure, p.BloodType, p.Cholesterol, p.RestingHeartBeat }); v.ToTable("VitalStats"); }); } }
And here is my DbContext class.
public class HealthContext : DbContext { DbSet<Customer> Customer { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } }
No comments:
Post a Comment