I'm building an application that takes data from an existing table, and then splits it into multiple entities, that follow specific trends. It is for a letting agent that manages multiple different agencies. One such shared entity that I have identified is the Address, shared by Landlord, Letting Agent and the actual property all of which share the properties below:
public class Address
{
public string HouseNumber
public string FlatPosition
public string AddressLine
public string Town
public string County
public string Postcode
}
In the giant table, they follow the above schema, but are specified with the relevant noun in front e.g. "LandlordHouseNumber etc., PropertyHouseNumber etc., LettingAgentHouseNumber etc.,"
Is it possible to take the data from the table, and instantiate with the address class whilst being able to distinguish the entity they represent? Or will I need to have an address class for each?
EDIT:
As suspected, what you want is to define a Complex Type
for the address then map the properties to the appropriate columns.
public class Address
{
public string HouseNumber { get; set; }
public string FlatPosition { get; set; }
public string AddressLine { get; set; }
public string Town { get; set; }
public string County { get; set; }
public string Postcode { get; set; }
}
public YourEntity
{
public int Id { get; set; } // or whatever you use
// other properties
// complex type properites
public Address LandlordAddress { get; set; }
public Address LandlordAgentAddress { get; set; }
}
Then configure in your DbContext
:
protected void OnModelCreating( DbModelBuilder modelBuilder )
{
// configure like an entity but use .ComplexType<>()
modelBuilder.ComplexType<Address>()
// e.g. set max size of one of the properties
.Property( a => a.Postcode )
.HasMaxLength( 10 );
// etc.
// map properties to columns if you don't want to use default naming convention
modelBuilder.Entity<YourEntityType>()
.Property( yet => yet.LandlordAddress.Postcode )
.HasColumnName( "LandlordPostcode" );
modelBuilder.Entity<YourEntityType>()
.Property( yet => yet.LandordAgentAddress.Postcode )
.HasColumnName( "LandlordAgentPostcode" );
}
You could create a view, or create a query, that folds these 3x columns into a sensible one column.
//Model
public class Address
{
public string AHouseNumber
public string BHouseNumber
public string CHouseNumber
(...)
You could do a simple concat:
await db.Addresses
.Select( a=> new { Address = AHouseNumber + BHouseNumber + CHouseNumber } )
.ToListAsync();