【问题标题】:Entity Relations: Inheritance, Composition, Interface, or Mixed Set?实体关系:继承、组合、接口还是混合集?
【发布时间】:2014-05-16 20:47:19
【问题描述】:

我真的在为这种情况苦苦挣扎:

我有两个实体: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 ?
}

它的用途是:

  • 获取作为人员的供应商
  • 获取属于公司的供应商
  • 获取所有供应商

理想情况下,我希望使用对象 Supplier 访问 Company 或 Person 的特定属性。

这可能吗?设计的缺陷在哪里(可以肯定至少有一个)。

我的想法:

  • Person Contact
  • Company Contact
  • Supplier Person Company
  • Person 可以成为Supplier
  • Company 可以成为Supplier
  • Supplier 不能成为Person 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> {}

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

【问题讨论】:

  • 我认为你需要 Haskel。如果您继续使用 Java,请让 Company 和 Person 实现 Supplier。
  • 这不是暗示公司是供应商而不是可以成为供应商吗?
  • 你为什么不摆脱 Person 和 Company 类,只使用带有一组通用属性和一个附加属性的 Contact 来指定特定对象是什么类型的联系人(Person 或 Company),这样Contact 类可以很容易地成为 Supplier 类的基础。如果你这样做,你不会遇到实体框架设计的问题。
  • @stripthesoul 因为公司和个人虽然有共同的属性,但导航是并且需要完全不同。
  • 这是 c# 而不是 java。无论如何,我不介意拥有 bool 属性。仍然我不明白这是如何适应的。顺便说一句,公司和个人虽然有共同的属性(地址、电子邮件、电话、税号等),但它们有区别。像中间名(人)、雇员(公司)、Childs(人)、兄弟(人)、子公司(公司)、股票代码(公司)、职业(人)、课程(人)等。

标签: entity-relationship


【解决方案1】:

让您的个人和公司实现供应商接口。供应商扩展了联系接口。现在,您可以将个人和公司纳入您的供应商列表

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

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

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2015-09-16
    相关资源
    最近更新 更多