代码之家  ›  专栏  ›  技术社区  ›  John Nicholas

实体框架:多重继承

  •  2
  • John Nicholas  · 技术社区  · 15 年前

    很明显我在和.net战斗…答案可能是我找错了树,我应该继续使用5年前的数据库设计。

    我想要的是有一个抽象对象客户机,并有两个继承的对象供应商和客户。

    客户与供应商和客户的关系为1:0/1。

    这似乎意味着基于继承的解决方案可以很好地工作,因为它可以使我编写更少的验证代码,并控制强类型集合。

    然而,开箱即用的实体框架坚持在客户机表上使用唯一的ID,并且拒绝让您从客户和供应商表中引用相同的ID。

    当您进入数据库并手动编辑这两个继承对象上的ID相同时,您会遇到问题,因为客户端集合有索引冲突(毫不意外)。

    结果是,我不能让一个客户同时作为供应商和客户出现(我很高兴两个独立的对象共享相同的ID)。

    这就引出了一个设计问题,即如何对该场景进行最佳建模…我面临的风险是,必须为“isCustomer”、“issupplier”或“Supplier and Customers”表执行条件联接和布尔字段,该表联接到客户机并编写代码以维护与客户机的0-1关系。

    一定是别人出了这种事?没有优雅的解决方案?

    另一种选择: 我需要同一个对象的多个视图。这意味着我不能简单地在一个字段上使用整数值来确定允许哪些视图。我需要使用几个bool字段来确定允许哪些对象视图。

    这在英孚有可能吗?显然,我可以在数据库中创建视图,但我宁愿从EF中创建视图,并让它创建SQL。(虽然我已经定义了sp来在db中设置各种键和约束,但这意味着我越来越可能放弃使用ef生成模式)

    3 回复  |  直到 9 年前
        1
  •  1
  •   Adam Robinson    15 年前

    不幸的是,你所要求的是不可能实现的。.NET不允许多重继承,因此这不是(也不会是)EF或任何其他ORM的功能。

    您必须在ef设计器中删除继承,并且只允许表之间的正常1:1*关联。

    您将最终得到所需的数据库设计,并且您的C语法将如下所示:

    Client c;
    
    c.Customer.[...]
    c.Supplier.[...]
    
        2
  •  0
  •   Beth    15 年前

    把客户和供应商的共同点放在客户身上,只放在客户身上特定于客户的东西,供应商身上特定于供应商的东西。

    3个表,3种对象。

        3
  •  0
  •   QoP    9 年前

    我知道这个职位,如果5岁的英孚还没有解决这个问题…

    也许我遗漏了一些东西,但是ef不会让多个孩子从一个父母那里继承,而dotnet完全可以做到这一点。我可以通过将每个实体更改为分部类,然后定义每个分部类实现的接口来解决这个问题。太荒谬了。数据库中的每个表都有4列:createdby、createdon、updatedby、updatedon。如果我在实体框架中创建一个抽象类,我应该能够从这个抽象类继承每个实体,这样每个实体都有这四个字段。但不能。只能从抽象类继承一个表。这毫无意义。它完全破坏了抽象类的目的。我希望每个实体都具有这四个字段,但只有一个孩子可以拥有它们。公司应该有这四个领域。设施,公司的一个孩子,也应该有这四个领域。但不行,不行。尽管TimestampTable是一个抽象类,但只有一个表可以继承,只有一个表获得四个字段

    这是实体图

    不管怎样,我感觉到你的痛苦,还有工作要做。创建所需的接口,将实体更改为分部类,然后在每个实体的单独文件中从该接口继承分部类,

    您必须在每个分部类文件中手工实现该接口。

    祝你好运(或找到另一个ORM)

    父级和dotnet完全可以做到这一点。我可以通过将每个实体更改为分部类,然后定义每个分部类实现的接口来解决这个问题。太荒谬了。数据库中的每个表都有4列:createdby、createdon、updatedby、updatedon。如果我在实体框架中创建一个抽象类,我应该能够从这个抽象类继承每个实体,这样每个实体都有这四个字段。但不能。只能从抽象类继承一个表。这毫无意义。它完全破坏了抽象类的目的。我希望每个实体都具有这四个字段,但只有一个孩子可以拥有它们。公司应该有这四个领域。设施是公司的子项,也应该有这四个字段。但不行,不行。尽管TimestampTable是一个抽象类,但只有一个表可以继承,只有一个表获得四个字段

    这是实体图

    enter image description here

    ……不管怎样,我感觉到了你的痛苦,周围还有工作。创建所需的接口,将实体更改为分部类,然后在每个实体的单独文件中从该接口继承分部类,

    您必须在每个分部类文件中手工实现该接口。

    祝你好运(或找到另一个ORM)