【问题标题】:Entity framework - Inheritance for tables实体框架 - 表的继承
【发布时间】:2012-10-18 13:12:08
【问题描述】:

如何在 Entity Framework 中管理以下两个表:


订单

  • 订单号
  • 产品编号
  • 日期


订单存档

  • 订单号
  • 产品编号
  • 日期

在此模式中,订单会定期从表 Order 传输到表 OrderArchive... 每个类型的表和每个层次结构的表似乎都不符合我的需求...我想为这两种对象类型共享相同的方法。

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

【问题讨论】:

    标签: entity-framework inheritance


    【解决方案1】:

    好吧,如果您不能更改数据库架构,...您有一个巨大的限制!

    如果你能改变这一点,我会做一个(抽象的)OrderBase 类,具有通用的属性和方法,并让 OrderOrderArchive 继承它。

    但如果你不能,我唯一看到的(有人可能有更好的主意)就是

    创建一个接口 IOrder

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

    使 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)?

    【讨论】:

    • 谢谢你的回答我不知道每混凝土表的类型,我遵循了这个文档blogs.microsoft.co.il/blogs/gilf/archive/2010/01/25/…,它几乎是完美的......但是使用这种方法我无法检索两个表的记录单个查询(不使用 UNION)?
    • @user1756338 那是对应的,是的。但是如果你不改变你的数据库结构......别无选择!
    猜你喜欢
    • 2013-04-21
    • 2011-05-19
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多