2011-12-30 55 views
1

是否可以在实体框架中创建实体视图而不在DAL中创建视图?创建实体视图

我有一个父表,名为收据收据可以是活动的或不活动的。如果我实施IsActive作为收据的属性,那么忘记将.Where(r=>r.IsActive)附加到所有Linq查询并将其添加到以前的代码中的成本很高。我试图继承儿童DeletedReceipt条件IsActive = false在模型和添加条件IsActive = true收据(父)。幸福的生意没有任何改变。问题是我不能写停用方法,而收据有很多重要的关系。我知道它不是面向对象的。我认为我可以处理它的观点。但我不改变我的DAL商业方法! 的情况是“IsActive”起到辨别器的作用,并且不能在中更新取消激活方法。一种方式可能是使用SP,但这意味着“DAL请处理我该死的业务逻辑”。 有什么想法?

+0

我上次检查** **没有**。 – 2011-12-30 09:25:06

+0

你能否提供更多细节? – 2011-12-30 09:25:27

+0

[QueryView] [1]有助于以某种方式创建实体视图,但不支持导航道具。 [1]:http://msdn.microsoft.com/en-us/library/cc716798.aspx – 2011-12-30 12:33:35

回答

2

有两种方法来创建视图:

  • DefiningQuery - 在EDMX文件的SSDL部分自定义SQL选择。您可以使用任何SQL来定义新的只读实体。问题是,一旦你使用它,你不能再使用从数据库更新,因为它会覆盖你在EDMX中的改变(除非你为EF设计者购买了一些更强大的扩展)。
  • QueryView - 自定义ESQL在EDMX文件的MSL部分中选择,它必须从现有实体中选择。它支持关系,但只支持其他查询视图。

在这两种情况下创建的实体是一个视图=只读。除非将更新,插入和删除操作映射到存储过程或自定义SQL(再次写入EDMX文件),否则不能将其用于保存更改。

无论如何,你正在尝试做的事情会导致很多问题。你有没有需要在你的应用程序中访问DeletedReceipt?如果是的话,你需要完整的逻辑,因为你有ActiveReceipt?如果没有不这样做。

问题是IsActive软删除的条件是EF处理得不好。您可以在不需要使用Where(r => r.IsActive)的主要查询中解决问题,但您是否曾使用预先加载或延迟加载来加载其他实体的相关收据?如果是,你希望只加载有效的收据?这是真正的问题。无论是急切还是懒惰加载都支持过滤,因此您将始终加载活动记录和已删除记录。处理这种情况的唯一方法是(无需手动执行所有操作)conditional mapping但条件映射允许您在应用程序中仅包含这些实体中的一个,并且您需要自定义存储过程以进行软删除。

“DAL请处理我该死的业务逻辑”

作为一个侧面说明这个报价,如果你不想DAL处理任何逻辑不要指望它给你才有效收据自动。这也是DAL中的逻辑。所以如果你真的认为在所有查询中使用Where(r => r.IsActive)就是你要找的。如果你想从DAL获得一些帮助,它必须包含一些逻辑,有时候这些逻辑将在SQL中。

+0

谢谢拉迪斯拉夫您的完整答案。所以你的意思是我应该纠正我的想法! – 2011-12-30 14:54:34