实体框架 - 表的继承

时间:2012-10-18 13:12:08

标签: entity-framework inheritance

如何管理实体框架中的以下两个表:


顺序

  • OrderId
  • ProductId
  • 日期


OrderArchive

  • OrderId
  • ProductId
  • 日期

在此模式中,订单会定期从表Order转移到表OrderArchive ... Table Per Type和Table Per Hierarchy似乎都不符合我的需求......我想为两种对象类型共享相同的方法。

请注意,我无法更改数据库架构。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

好吧,如果你不能改变数据库模式,......你有一个巨大的限制!

如果你可以改变它,我会使用常见的属性和方法做一个(抽象)OrderBase类,并使OrderOrderArchive继承它。

但如果你不能,我唯一能看到的东西(有人可能有更好的想法)就是

创建一个接口IOrder

public Interface IOrder {
   int OrderId {get;set;}
   int ProductId {get;set;}
   int Date {get;set;}
}

make OrderOrderArchive实现IOrder(不会更改数据库架构)

并使用常用方法创建一个辅助类。

public static class IOrderHelper {
   //a fake method
   public static IList<IOrder> GetOrderByDate(IEnumerable<IOrder> orderList, DateTime dt) {
       return orderList.Where(m => m.Date.Date == dt);
    }
}

但当然,在这种情况下,继承会更加清晰。

修改 也许查找每个具体类型的表:您可能能够从一个抽象类继承,该类不会在db中映射,并且您的数据库不会被更改。

使用Code First,您必须执行

modelBuilder.Entity<Order>()
    .Map(m =>
            {
                m.ToTable("Orders");
                m.MapInheritedProperties();
            });
modelBuilder.Entity<ArchiveOrder>()
    .Map(m =>
            {
                m.ToTable("ArchiveOrders");
                m.MapInheritedProperties();
            });

但我不知道你在使用什么(CodeFirst,ModelFirst,DatabaseFirst)?