【问题标题】:Override behaviors in Entity Framework覆盖实体框架中的行为
【发布时间】:2012-03-11 20:02:44
【问题描述】:

我们的数据模型有一些要求。我想找到一种方法,让这些要求在使用 EF 时尽可能透明。

首先,模型必须支持软删除。我已经看到了一些与此相关的问题,我认为这会相对简单。

其次,我们有“仅插入”政策。这意味着没有更新。进行更新时,必须改为插入新条目。我希望能够将该操作视为更新,并让框架将其更改为幕后的插入。

第三,由于#2,我们在查询时,需要对标识列进行降序排序,只返回第一条记录。即使在执行返回许多记录的查询时。本质上,这会创建版本历史记录。

第四,我们不想在每个查询中都实现这个逻辑。让框架为我们做这件事会很好,这样我们就可以将每个查询视为普通的 CRUD 类型事务。

有人在 EF 中实现过这样的数据模型吗?你使用了哪些技术?

我知道其中一些可以在视图和/或 Sprocs 中完成,但如果您使用视图,则必须手动维护所有关系(EF 无法通过视图读取关系)。触发器也是一种可能性,但我们的 DBA 想要尽可能少的触发器,并且对所有需要很长时间才能完成的触发器有非常广​​泛的审查政策。如果没有必要,我宁愿不使用触发器。

我主要使用数据库优先方法,但我使用 dbcontext。

编辑:

鉴于下面的 Ladislav 的 cmets,我也对可能能够处理这些要求的其他 ORM 的任何 cmets 感兴趣。

【问题讨论】:

  • 在#4,您似乎总是希望在特定实体上实现此功能,而不是基于每个查询,对吧?那么它应该是一个实体类的可配置属性?
  • @GertArnold - 我不明白你的问题。实体是 POCO,因此它们不控制用于填充它们的查询的逻辑。
  • 我以为您希望某些类具有定期更新和一些经过审核的“仅插入”更新(在任何地方进行配置)。可能不会。

标签: orm entity-framework-4 data-modeling dbcontext


【解决方案1】:
  1. 这可以通过条件映射实现,其中附加列将用于区分已删除的记录和 custom SQL command / 映射存储过程,用于需要软删除以执行更新而不是删除的每个实体。
  2. 我怀疑 EF 会透明地处理这个问题。如果您修改从数据库加载的附加实例,它将执行更新。您可以再次映射存储过程以执行插入而不是更新,但该更改不会反映在您的应用程序逻辑中。您必须使用新的上下文实例处理上下文并重新加载数据才能正确查看更改。更好的选择是简单地强制您的应用程序在某处克隆实体并将克隆作为新实体插入。
  3. EF 不允许您将此类条件透明地添加到自动生成的查询中,除非您将其映射为视图或custom SQL query。一旦您使用视图或 SQL 查询,您还必须使用 SQL 命令或来自插入、更新和删除操作的存储过程。使用自定义 SQL 查询与使用视图具有相同的缺点。
  4. 如果您不使用 SQL 查询,则必须自己编写查询,例如以自定义可重用扩展方法的形式并在任何地方使用它,但请注意,急切或延迟加载不会反映这一点。在急切和延迟加载的情况下,您将始终获得所有版本。

存储过程映射需要 EDMX。自定义 SQL 命令和查询映射需要 EDMX,如果没有任何其他商业工具,您还必须手动维护 EDMX。

【讨论】:

  • 这很不幸。你知道任何其他更适合这种情况的 ORM 吗? nHibernate 可以处理这个吗?
  • 没有涵盖所有内容,但仍然很有趣:stackoverflow.com/questions/9199078/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多