【问题标题】:Entity Framework 4: Is there a way to mark an entity "insert-only" (without using stored procedures)实体框架 4:有没有办法将实体标记为“仅插入”(不使用存储过程)
【发布时间】:2012-04-30 19:46:02
【问题描述】:

我们正在使用 v4 实体框架作为新版本应用程序的一部分,该应用程序包括一些重要的会计功能(支付处理、现金平衡、空头支票处理等)。在我们以前的所有应用程序中,我们已经建立了一个政策(我听说这在银行/会计级别的应用程序中非常普遍)至少有一个表,其中包含所有资金的传入“审计跟踪”,只能使用新数据写入。

换句话说,进入系统的新信息将触发新实体的创建,该实体将通过我们拥有的任何数据层对象的“插入”操作,并将新行写入基础表中。数据层是有意实现的,对这些实体no 更新或删除操作;任何更改都会作为新插入的调整行进行跟踪。

使用 EF,我们正在寻找一种方法来实现相同的目标,但在这种情况下,我们显然需要防止 EF 允许更新(而不是仅仅不编写函数)。是否有某种方法可以将 EF 模型中的实体指定为“仅插入”?

正如我在标题中提到的:我知道这可以通过将存储过程映射到插入操作而不是更新操作来实现。我们正在寻找其他选项(如果存在),原因有二:

  1. 我们还没有任何存储过程,如果可以的话,我们希望避免在我们的部署/升级过程中添加其他元素。
  2. 此解决方案依赖于“不存在”存储过程来指示表是特殊的。我更喜欢一个依赖于明确断言的解决方案,即“仅插入”是故意的。

【问题讨论】:

    标签: entity-framework-4


    【解决方案1】:

    是的,您最好的选择是将 .AsNoTracking 添加到模型中每个 DbSet 的 getter 中。这将意味着 EF 不会跟踪您从数据库中获得的任何实体(因此不会对它们执行任何回写)。它还具有提高性能的额外好处。

    通过强制所有读取为只读,您将消除 EF 中的更新路径。

    看看at my post on AsNoTrackingthis article on the EF site

    【讨论】:

    • 这看起来很有希望;如果自我跟踪实体支持这一点,您是否碰巧知道? (我要到明天才能检查)
    • @MichaelEdenfield 我对自我跟踪实体一无所知,但自我跟踪和只读的概念似乎有点相互排斥(因为每个实体都知道如何将自己写回本质上)。也许您最好使用一个接口来定义您的实体,并为您跟踪的实体和查询的实体使用不同的具体实现。
    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多