【问题标题】:Using Stored Procedures with N-Tier Entity Framework在 N 层实体框架中使用存储过程
【发布时间】:2014-07-24 00:59:22
【问题描述】:

我在尝试使用 N 层实体框架中的存储过程时遇到了一些有趣的情况。我想确认这些情况不是我们的实施所独有的,并且想了解我们的解决方案是最好的还是有更好的解决方案。

  1. 映射要求:将 context.SaveChanges() 与映射存储过程一起使用时,必须为给定实体映射所有存储过程;意思是,如果一个插入 SP 被映射但一个更新 SP 没有被映射,则在尝试处理更新时会发生异常,因为框架“在映射文件中找不到 EntityType 'PriceFileCustomerPrice' 的 UpdateFunctionMapping”。我们只想映射那些必要的 SP,让框架处理其余的插入/更新/删除处理。 我们如何映射插入而不映射更新或删除?

  2. MISSING DATA IN CHANGESET:尝试使用映射更新存储过程时存在问题,因为框架只为已更改的属性提供数据,而所有其他属性(除了键)具有空值或零值由于 ChangeSet 忽略了所有未更改的记录和属性。因此,未更改实体的属性值不会被传递,但映射的存储过程需要大多数属性/sp 参数的值;这会导致更新错误地将有效数据替换为 null 或零。 (不使用存储过程更新时不会出现此问题;意思是,框架使用自己的更新方法成功处理丢失的数据。)

    一个。我们对此的解决方案是从 OnChange() 调用存储过程而不是映射它,但是……在调用 OnChange() 方法之后,框架仍然调用它自己的 Update 方法,然后由于键违规而引发异常(在插入时) ;因此,为了防止这种异常,我们映射了什么都不做的模拟/虚拟存储过程。

    b. 有没有办法映射更新存储过程并接收所有更改和未更改的属性值?

  3. 分离实体集:调用 SaveChanges() 将处理对所有实体集的所有修改;因此,如果 EntitySet 已被修改但不应保存,则必须在调用 SaveChanges() 之前将其分离 (Context.EntitySet.DetachAll()),然后一次重新附加一个 (Context.Attach(entity))。类似地,单个实体也可以被分离和重新连接。 这是处理这种情况的最佳方法吗?(我认为这只是一般的 EF 问题,而不是特定于 N 层的问题。)

@ChristofSenn 非常感谢您的回复。谢谢!

【问题讨论】:

  • 关于项目#2,看起来添加 [IncludeOnUpdate] 属性将解决丢失数据的问题。耶!

标签: c# entity-framework stored-procedures mapping n-tier-architecture


【解决方案1】:
  1. 映射要求:据我所知,如果您映射任何创建、更新或删除函数,EF 不会退回到默认行为。因此,除非您知道给定实体,例如您永远不会删除记录,如果您映射了插入或更新,则需要映射删除功能。 在决定是否使用存储过程时,我发现 post 很有用。

  2. 更改集中缺少数据:正如您已经发现的那样,默认情况下,N 层实体框架仅将更改(或其他所需的数据,如 PK)从客户端传输到服务器。应始终包含的属性可以根据需要使用IncludeOnUpdateAttributeIncludeOnDeleteAttribute 进行注释。

  3. 选择性地保存更改:context.SaveChanges 将给定上下文的所有挂起更改作为工作单元提交给数据服务。如果您只想保存特定实体,您可以从上下文中删除(-> 分离)其他实体,或者将要保存的实体添加(-> 附加)到单独的上下文实例中,您只能临时创建该实例以此目的。没有什么可以阻止您将一个实体同时附加到多个上下文。 但是,这应该谨慎使用,因为很容易出错,尤其是涉及到具有关系的实体时。

【讨论】:

  • 1.您的回复证实了我所阅读和体验的内容。 2. 我已将 IncludeOnUpdateAttribute 和 IncludeOnDeleteAttribute 添加到 NTierEF.EntityTT.CS.ttinclude 文件中,以便包含所有实体的所有属性,所以我们都设置好了。 3. 您对将实体附加到多个上下文的评论和警告非常有帮助,并且将在我们不经常发生的情况下起作用。 @ChristofSenn
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多