实体框架代码优先:按id和Type进行多个实体映射

时间:2016-04-26 23:57:22

标签: c# entity-framework

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

数据库:

订单:

OrderId
BillToAddressId
ShipToAddressId

地址:

Id
Name
City
AddressType

如何映射这些

OrderBillTo按地址从地址表中选择地址:ParentId = {OrderId},AddressType ='OrderBillTo'

OrderShipTo按地址从地址表中选择地址:ParentId = {OrderId},AddressType ='OrderShipTo'

ShipmentShip从地址表中按字段选择地址:ParentId = {AddressId},AddressType ='ShipmentShipTo'

谢谢!

2 个答案:

答案 0 :(得分:1)

这不是EF旨在处理的用例。它假定您在表和类之间具有一对一映射。

那就是说,你真的需要所有那些Address的子类吗?

答案 1 :(得分:1)

使用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);