【发布时间】:2014-07-24 00:59:22
【问题描述】:
我在尝试使用 N 层实体框架中的存储过程时遇到了一些有趣的情况。我想确认这些情况不是我们的实施所独有的,并且想了解我们的解决方案是最好的还是有更好的解决方案。
映射要求:将 context.SaveChanges() 与映射存储过程一起使用时,必须为给定实体映射所有存储过程;意思是,如果一个插入 SP 被映射但一个更新 SP 没有被映射,则在尝试处理更新时会发生异常,因为框架“在映射文件中找不到 EntityType 'PriceFileCustomerPrice' 的 UpdateFunctionMapping”。我们只想映射那些必要的 SP,让框架处理其余的插入/更新/删除处理。 我们如何映射插入而不映射更新或删除?
-
MISSING DATA IN CHANGESET:尝试使用映射更新存储过程时存在问题,因为框架只为已更改的属性提供数据,而所有其他属性(除了键)具有空值或零值由于 ChangeSet 忽略了所有未更改的记录和属性。因此,未更改实体的属性值不会被传递,但映射的存储过程需要大多数属性/sp 参数的值;这会导致更新错误地将有效数据替换为 null 或零。 (不使用存储过程更新时不会出现此问题;意思是,框架使用自己的更新方法成功处理丢失的数据。)
一个。我们对此的解决方案是从 OnChange() 调用存储过程而不是映射它,但是……在调用 OnChange() 方法之后,框架仍然调用它自己的 Update 方法,然后由于键违规而引发异常(在插入时) ;因此,为了防止这种异常,我们映射了什么都不做的模拟/虚拟存储过程。
b. 有没有办法映射更新存储过程并接收所有更改和未更改的属性值?
分离实体集:调用 SaveChanges() 将处理对所有实体集的所有修改;因此,如果 EntitySet 已被修改但不应保存,则必须在调用 SaveChanges() 之前将其分离 (Context.EntitySet.DetachAll()),然后一次重新附加一个 (Context.Attach(entity))。类似地,单个实体也可以被分离和重新连接。 这是处理这种情况的最佳方法吗?(我认为这只是一般的 EF 问题,而不是特定于 N 层的问题。)
@ChristofSenn 非常感谢您的回复。谢谢!
【问题讨论】:
-
关于项目#2,看起来添加 [IncludeOnUpdate] 属性将解决丢失数据的问题。耶!
标签: c# entity-framework stored-procedures mapping n-tier-architecture