实体关系:继承,组合,接口还是混合集?

时间:2014-05-16 05:12:32

标签: entity-relationship

我真的很挣扎这个场景:

我有两个实体:PersonCompany

两者共享公共属性,因此我有一个基本抽象类Contact

现在我有另一个名为Supplier的实体,可以是CompanyPerson

我只是不知道如何设置这种情况。

到目前为止我所拥有的是:

public abstract class Contact {
    public abstract string DisplayName { get; }
    ...
}
public class Person : Contact {
    public override string DisplayName { ... }
    public string SomePersonProperty { get; set; }
    ...
}
public class Company : Contact {
    public override string DisplayName {...}
    public string SomeCompanyProperty { get; set; }
    ...
}
public class Supplier {
    public ICollection<Product> Products { get; set; }
    ...
     // how can I make this being either a Person or a Company ?
}

用于此目的将是:

  • 获取人员供应商
  • 获取公司供应商
  • 获取所有供应商

理想情况下,对象供应商我想要访问公司或个人的特定属性。

这甚至可能吗?设计中的缺陷在哪里(非常确定至少有一个)。

从我的想法:

  • Person 一个Contact
  • Company 一个Contact
  • Supplier Person a Company
  • Person 可以成为Supplier
  • Company 可以成为Supplier
  • Supplier 不能成为Person a Company

我正在尝试在C#Entity Framework Code First中实现这一点,但我认为这个问题并不接近这些技术。

更新:我想出了这个,但我不确定是好还是凌乱。欢迎提出意见!

public abstract class Supplier  {
    public int SupplierId { get; set; }
    public ICollection<Product> Products { get; set; }
    ...
}

public abstract class Supplier<T> : Supplier where T : Contact {
    public T Contact { get; set; }
}

public class SupplierPerson : Supplier<Person> {}
public class SupplierCompany : Supplier<Company> {}

不确定这会生成什么类型​​的数据库架构......

1 个答案:

答案 0 :(得分:0)

让您的人员和公司实施供应商界面。供应商扩展了Contact界面。现在,您可以将人员和公司纳入供应商列表

class Institution {
  Supplier supplier; // refers either Person or Company

这是自然的实现,因此,您的优势在于您不需要为每个对象分配额外的空间来存储引用的供应商的类别。我认为这个解决方案是不可接受的OOP is considered evil ourdays