简体   繁体   中英

Entity Framework Code First: Multiple entity mapping by id and Type

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!

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?

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM