【发布时间】:2014-05-16 20:47:19
【问题描述】:
我真的在为这种情况苦苦挣扎:
我有两个实体:Person 和 Company
两者都有共同的属性,所以我有一个基本抽象类Contact
现在我有另一个名为 Supplier 的实体,它可以是 Company 或 Person
我只是不知道如何设置这个场景。
到目前为止我所拥有的是:
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(人)、兄弟(人)、子公司(公司)、股票代码(公司)、职业(人)、课程(人)等。