创建实体视图

时间:2011-12-30 09:23:43

标签: entity-framework entity-framework-4

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

我有一个名为 Receipt 的父表。 收据可以是有效或无效的。如果我将 IsActive 作为收据的属性实施,那么忘记将.Where(r=>r.IsActive)附加到所有Linq查询以及将其添加到之前的高成本的风险很高码。我试图在模型中继承一个名为 IsActive = false 的子 DeletedReceipt ,并将条件 IsActive = true 添加到Receipt(Parent)。幸福的生意没有任何改变。问题是我不能写Deactivate方法而Receipt有很多重要的关系。我知道它不是面向对象的。我想我可以用一种观点来处理它。但我不会改变我的商业方法的DAL! 情况是“ IsActive ”扮演Discriminator角色,并且在 Deactivate 方法中不可更新。一种方式可能是使用SP,但这意味着“DAL请处理我该死的业务逻辑”。 任何想法?

1 个答案:

答案 0 :(得分:2)

创建视图有两种方法:

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

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

无论如何,你要做的事情会导致很多问题。您是否需要在应用程序中访问DeletedReceipt?如果是,您是否需要像ActiveReceipt那样拥有完整的逻辑?如果没有不这样做。

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

  

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

如果您不希望DAL处理任何逻辑,请注意此引用,但不要指望它只会自动为您提供有效收据。这也是DAL中的逻辑。因此,如果您真的想要在所有查询中使用Where(r => r.IsActive),那么您正在寻找。如果你想从DAL获得一些帮助,它必须包含一些逻辑,有时逻辑将在SQL中。