【问题标题】:Why Entity Framework do not use Inheritance when mapping my DB tables为什么实体框架在映射我的数据库表时不使用继承
【发布时间】:2016-04-26 13:11:18
【问题描述】:

我正在开发一个 asp.net mvc web 应用程序。我已经使用 EF-6 映射了我的数据库表,它创建了一个包含我的模型类的 .tt 文件夹。但我注意到实体框架没有定义模型类之间的继承,而是使用类之间的引用。例如,我有一个父数据库表名 Technology,它有子表,例如 Server 、 VM 等。 现在为技术和服务器生成的类如下所示:-

 public partial class Technology
    {
        public Technology()
        {
            this.Servers = new HashSet<Server>();

        }

        public int TechnologyID { get; set; }
        public string Tag { get; set; }
        public bool IsDeleted { get; set; }
        public byte[] timestamp { get; set; }
        public Nullable<int> TypeID { get; set; }
        public Nullable<long> PartialTag { get; set; }
        public bool IsManaged { get; set; }


        public virtual Server Server { get; set; }

        public virtual VirtualMachine VirtualMachine { get; set; }
    }


 public Server()


        public int ServerID { get; set; }
        public int ServerModelID { get; set; }
        public string ILOIP { get; set; }
        public Nullable<int> RackID { get; set; }
        public Nullable<int> StatusID { get; set; }
        public Nullable<int> BackUpStatusID { get; set; }
        public int RoleID { get; set; }
        public Nullable<int> OperatingSystemID { get; set; }
        public Nullable<int> VirtualCenterID { get; set; }
        public string Comment { get; set; }
        public byte[] timestamp { get; set; }



        public virtual Technology Technology { get; set; }

    }

在 DB 内部,Server.ServerIDTechnology.TechnologyID 的外键。

所以我期待 EF 将 Technology 定义为父对象,并且 Server、VM 将扩展(继承技术)。但是 EF 会在其子项中为技术创建一个引用.. 那么使用这种方法而不是创建继承的想法是什么?

【问题讨论】:

    标签: c# entity-framework inheritance object-oriented-analysis


    【解决方案1】:

    所以我期待 EF 将 Technology 定义为父对象

    是的。为什么?

    • 您无需费心阅读文档。这是很清楚的。

    • 您在没有考虑边缘情况的情况下做出了假设。如果 EF 会自动这样做,那么它会在很多情况下做出错误的决定。

    没有很好的自动方法来做到这一点。因为继承和包含都经常使用——所以 EF 不能自动做出决定。同样,它不会神奇地为您的 Tag 属性(字符串)创建一个合理的字段,因为它不知道合理的最大长度是多少,或者它是否应该允许 unicode。

    【讨论】:

    • 你能详细解释一下吗?
    • 您能否详细介绍一下为什么 EF 在映射 DB 表时总是使用组合而不是继承?我并不是说使用组合是错误的,而是我想了解 EF 是如何工作的?
    • EF,没有进一步的说明,将默认为合成。它支持继承,但它不会为你做这个决定。
    • 所以我认为最好的方法是通过 EF 提供的模型类之间的组合来保持原样。似乎迫使 EF 具有继承而不是组合是一个令人头疼的问题,并且会有性能缺陷。所以我认为我应该保持原样并使用组合。你对此有何看法?
    • 这也是我所做的 - 但是我的数据模型大多没有继承开始(例如:在更高级别也很少有继承 - 这并不是我更聪明的意思或者更笨,只是当您使用金融交易数据时,几乎没有“真正需要”继承)。我也首先使用数据库,并且我的数据库经过高度优化(即使用所有 SQL Server 功能,而不仅仅是使用 Entity Framework 轻松完成的小部分)。
    【解决方案2】:

    所以你先使用 db。

    您的表格没有鉴别器列。 Ef 不会将它们识别为TPH

    您的表有自己的主键。 Ef 不会将它们识别为TPTTPC

    但我没有测试或应用,即使你的表完全符合继承类型之一,ef 可能不会像你预期的那样生成模型类。

    TomTom在评论中提到,Ef有默认设计,不会先在db上为你创建继承。

    【讨论】:

    • 所以你的意思是当使用实体框架映射我的数据库表时,生成的类之间不会有任何继承对吗?
    • 我说你的设计,Ef 肯定不会映射。但是,如果您更改表格设计并进行测试,您会看到它。子类的主键和外键应该是同一列,并且应该与父类同名。你的Server 应该有TechnologyID 作为主键和外键。
    • @johnG 我说我没有测试它。如果你能改变和测试它。
    • 没有。 EF,没有程序员的指令,总是默认为组合。这有明确的记录。你可以改变行为,但必须由你自己做。
    • @ErkanDemirel 它也默认为数据库优先。没有明智的方法可以通过表模式来推断意图 - 在两个方向都有边缘情况,智能必须决定真正想要什么。因此,它默认不更改任何内容 - 并且数据库(至少是标准关系数据库)不支持继承。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多