Reputation: 61
namespace Sample.Orders
{
public class Order : FullAuditedEntity<string>
{
[Column("OrderId")]
public override string Id { get; set; }
public long BillToAddressId { get; set; }
public virtual Address.BillToAddress BillTo { get; set; }
public string ShipToAddressId { get; set; }
public virtual Address.ShipToAddress ShipTo { get; set; }
}
}
namespace Sample.Shipments
{
public class Shipmen : FullAuditedEntity<string>
{
[Column("ShipmentId")]
public override string Id { get; set; }
public long AddressId { get; set; }
public virtual Address.ShipmentShipTo ShipTo { get; set; }
}
}
namespace Sample.Address
{
public abstract class Address : FullAuditedEntity<string>
{
public override string Id { get; set; }
public double Name { get; set; }
public string City { get; set; }
public string ParentId { get; set; }
public string AddressType { get; set; }
}
public class OrderBillTo : Address { }
public class OrderShipTo : Address { }
public class ShipmentShipTo : Address { }
}
Database:
Order:
OrderId
BillToAddressId
ShipToAddressId
Address:
Id
Name
City
AddressType
How to mapping like these
OrderBillTo select Address from Address table by fields: ParentId={OrderId}, AddressType='OrderBillTo'
OrderShipTo select Address from Address table by fields: ParentId={OrderId}, AddressType='OrderShipTo'
ShipmentShipTo select Address from Address table by fields: ParentId={AddressId}, AddressType='ShipmentShipTo'
Thanks!
Upvotes: 1
Views: 151
Reputation: 3256
With Fluent API:
modelBuilder
.Entity<Order>
.HasOptional(order => order.BillTo)
.WithRequired(address => address.ParentId)
.HasForeignKey(order.BillToAddressId);
modelBuilder
.Entity<Order>
.HasOptional(order => order.ShipTo)
.WithRequired(address => address.ParentId)
.HasForeignKey(order.ShipToAddressId);
modelBuilder
.Entity<Shipment>
.HasOptional(order => order.ShipmentShipTo)
.WithRequired(address => address.ParentId)
.HasForeignKey(order.AddressId);
Upvotes: 1
Reputation: 70337
That's not a use case that EF was designed to handle. It assumes that you have a one-to-one mapping between tables and classes.
That said, do you really need all of those subclasses of Address?
Upvotes: 1