C# 在实体框架中设计具有多重(可选?)继承的模型

C# 在实体框架中设计具有多重(可选?)继承的模型,c#,entity-framework,oop,inheritance,composition,C#,Entity Framework,Oop,Inheritance,Composition,在过去的几天里,我一直在努力思考如何在EF中对这些实体进行建模。所以我决定请社区伸出援手:下面给出了核心类 class BaseEntity { long Id; DateTime DateCreated; } class Person : BaseEntity { string Name; string Address; } class Taxpayer : Person { string TaxpayerIdentificationNumber;

在过去的几天里,我一直在努力思考如何在EF中对这些实体进行建模。所以我决定请社区伸出援手:下面给出了核心类

class BaseEntity
{
   long Id;
   DateTime DateCreated;
}


class Person : BaseEntity
{
   string Name;
   string Address;
}

class Taxpayer : Person
{
    string TaxpayerIdentificationNumber;
    double Income;
    Taxpayer(or Person) Spouse;
}

class Client : BaseEntity
{
    string CustomerId;
    string ContactNumber;
}

class Partnership : Client
{
    List<Taxpayer (or Person)> Partners;
}

class Company : Client
{
    string CompanyRegistrationNumber;
}
这种情况下,客户可以是三种类型之一,即纳税人、合伙企业、公司专业化/IsA

问题是,对于纳税人类,他应该继承Client类和Person类的属性。更新:纳税人可以是客户,但不一定在使用纳税人类的其他地方也可以是客户,大多数情况下,纳税人类可以是个人类或纳税人类

关于如何进行有什么想法吗


谢谢。

你可能需要考虑一下,而不是上课。以下示例可能会有所帮助:

interface IBaseEntity
    {
        long Id;
        DateTime DateCreated;
    }

    interface IPerson : IBaseEntity
    {
        string Name;
        string Address;
    }

    interface IClient : IBaseEntity
    {
        string CustomerId;
        string ContactNumber;
    }

    class Taxpayer : IClient, IPerson
    {
        string TaxpayerIdentificationNumber;
        double Income;
        Taxpayer Spouse;
    }

    class Partnership : IClient
    {
        List<Taxpayer> Partners;
    }

    class Company : IClient
    {
        string CompanyRegistrationNumber;
    }
大声思考:

人是很多东西,但总是人。一个人不会仅仅因为失业、在商业伙伴关系中、或在专业场合整洁地眨眼而变成具有不同DNA的新物种

这让我想到了组合,而不是继承。客户可能会有一个人的推荐人来告诉她是谁。纳税人或合伙人也是如此

伙伴关系是对特定行为的参与。对于伙伴关系课程,我不在乎你是谁,只是你可以在伙伴关系中发挥作用。所以现在我在想,如何有明确的,具体的功能,重点放在纳税,合作

这让我想到了两种设计模式,访问者和装饰者。Decorator动态地向现有类添加功能;本质上是通过组合而不是继承来扩展类。访问者针对给定对象或一组所述对象执行其功能。访问者可以解决双重分派问题,即缺少多重继承


我从设计模式中得到两件事。首先是灵感。如何思考我的问题是什么。事实证明,灵感和视角远比单纯的食谱模式更有帮助。二是具体的面向对象设计。这就是设计、修改和扩展,而无需借助业余代码hack-n-slash。但不要把这个设计看得太字面。这些是模式,而不是死板的口述。特定编程语言的特性可以在这些模式中工作。我在想我是如何在C中使用委托来代替命令模式中要求的命令子类的。

为什么纳税人和客户不能都是继承人?他们不能,因为客户可以是合作伙伴/公司,而不是个人。感谢您的解决方案:这在一定程度上解决了这个问题。但是,当PartnersPatnerShip类或SpoosetAxPayer不是纳税人时,情况会怎样呢?