【发布时间】:2011-05-04 17:06:08
【问题描述】:
我找到了一些关于此的信息,但不足以让我了解此场景的最佳实践。我有一个带有抽象基类“公司”的典型 TPH 设置。我有几个孩子“小公司”,“大公司”等从公司继承。实际上,我实际上对公司有不同的现实分类,但在这个例子中我试图保持简单。在根据 TPH 的数据库中,我有一个带有 FirmTypeId 列(int)的单一公司表,用于区分所有这些类型。一切都很好,除了我需要允许用户将一种类型的公司更改为另一种类型的公司。例如,用户在添加公司时可能出错,并希望将其从 Big Firm 更改为 Small Firm。因为实体框架不允许将区分数据库列公开为属性,所以我不相信有一种方法可以通过 EF 将一种类型更改为另一种类型。如果我错了,请纠正我。在我看来,我有两个选择:
- 不要使用 TPH。只需拥有一个公司实体,然后返回使用 .Where(FirmTypeId == something) 来区分类型。
- 直接使用 context.ExecuteStoreCommand 执行 SQL 更新数据库的 FirmTypeId 列。
我看过一篇帖子,其中有人建议 OOP 的原则之一是实例不能更改其类型。尽管这对我来说很有意义,但我似乎无法将这些点联系起来。如果我们要遵循这个规则,那么使用任何类型继承(TPH/TPT)的唯一时间是当人们确定一种类型永远不会被转换为另一种类型时。所以小公司永远不会变成大公司。我看到建议应该改用组合。即使这对我来说没有意义(这意味着我看不到公司如何拥有大公司,对我来说大公司就是公司),我可以看到如果数据在 EF 中如何建模多个表。但是,在我在数据库中有一个表的情况下,它似乎是 TPH 或我在上面的 #1 和 #2 中描述的。
【问题讨论】:
-
那个“某人”可能就是我。在基于类的 OO 中,对象不能更改类型。曾经。 C# 不允许这样做。 EF 当然不会在 C# 中添加这样的功能。 EF 中唯一不同的是对象的生命周期更长——实际上是永久的。
-
克雷格,可能是你。我刚刚编辑了这篇文章,以包含更多关于此的信息。如果您不介意查看我帖子中的最后一段并了解正确的方法。
-
“小公司”和“大公司”到底有什么区别?顺便说一句,除非您将@Craig 放入其中,否则我不会收到您的回复通知。
-
@Craig,在我的示例中,在拥有额外列方面实际上没有区别。另一个例子是说我有一个带有 FlavorId 的 Icecreame 表,它是表中具有不同风味的表的外键。我认为在我的场景中,不必不断地编写 .Where(FlavorId == 1) 或 .Where(FlavorId == 2) 我只需通过使用 TPH 的继承来强类型化它们。当然有人可能会决定在管理网页上改变冰淇淋的味道,所以我的设计是 SOL。
-
我同意对象不应在 OO 中更改其类型,但如果有业务需求,我认为这样做没有任何问题。 @Craig:您能否举一个问题的例子,说明有人可能会通过更改对象类型来解决问题?
标签: c# asp.net asp.net-mvc entity-framework entity-framework-4