C# 在N层WCF MVC应用程序中实现对象更改跟踪
我在网上看到的大多数示例都显示了WinForms/WPF上下文中的对象更改跟踪。或者,如果它在web上,则使用连接的对象,因此,可以跟踪对每个对象所做的更改 在我的场景中,对象离开数据层后即断开连接(映射到WCF中的业务对象,并映射到MVC应用程序上的DTO) 当用户在MVC上对对象进行更改(例如,更改1字段属性)时,我如何将更改从视图发送到DB 我想要一个审计表,它保存对特定对象所做的更改。我想保存的是仅针对我们修改的属性的对象的前后值 我可以想出一些方法来做到这一点 1) 为MVC层(或javascript?)中的所有模型的每个属性实现IsDirty标志。将该信息一直传播到服务层,最后传播到数据层 2) 在服务层中使用这种更改跟踪机制将非常好,但是在修改后的值从MVC传回之后,我如何跟踪“原始”值呢 3) 数据库触发器?但我不知道如何开始。这可能吗 对于n层mvc wcf解决方案,是否有任何已知的对象更改跟踪实现 审计表示例:C# 在N层WCF MVC应用程序中实现对象更改跟踪,c#,asp.net-mvc,inotifypropertychanged,n-tier-architecture,change-tracking,C#,Asp.net Mvc,Inotifypropertychanged,N Tier Architecture,Change Tracking,我在网上看到的大多数示例都显示了WinForms/WPF上下文中的对象更改跟踪。或者,如果它在web上,则使用连接的对象,因此,可以跟踪对每个对象所做的更改 在我的场景中,对象离开数据层后即断开连接(映射到WCF中的业务对象,并映射到MVC应用程序上的DTO) 当用户在MVC上对对象进行更改(例如,更改1字段属性)时,我如何将更改从视图发送到DB 我想要一个审计表,它保存对特定对象所做的更改。我想保存的是仅针对我们修改的属性的对象的前后值 我可以想出一些方法来做到这一点 1) 为MVC层(或ja
Audit table
Id Object Property OldValue NewValue
--------------------------------------------------------------------------------------
1 Customer Name Bob Joe
2 Customer Age 21 22
此问题的可能解决方案在很大程度上取决于用户编辑数据时允许在数据库中进行哪些更改 换言之,一旦它“离开”数据库,它是专为用户锁定的,还是其他用户或进程可以同时更新它 例如,如果用户可以获取数据并在其上停留数小时或数天,但数据库仍允许更新数据,则您确实希望跟踪用户对数据库中当前版本所做的更改,而不是用户对其查看的数据所做的更改 我们处理此场景的方法是启动一个事务,读取整个现有对象,然后使用反射比较新旧值,将更改记录到审核日志中。在处理嵌套记录时,这会变得有点复杂,但花在实现上的时间是值得的 另一方面,如果不允许其他用户或进程更改数据,那么您有两个不同的选项,它们在复杂性、数据存储以及对现有数据结构的影响方面都有所不同 例如,您可以修改每个类中的每个属性,以记录其更改的时间,并在类中保留这些更改的运行记录(显然,基类实现在这里有很大帮助) 但是,根据捕获用户更改的时间点(例如,每次用户更新表单中的字段时),这可能会生成大量无用的日志信息,因为您可能只想从数据库角度而不是从UI角度了解更改的内容 您还可以深度克隆对象并将其传递到各个层。然后,当确定发生了什么变化时,您可以再次使用反射。但是,根据业务对象的大小,这种方法可能会造成严重的性能损失,因为必须将完整副本移动到网络上并与原始记录一起保留
您还可以实现与“编辑时允许更新”方法相同的方法。在我看来,这是最干净的解决方案,因为原始数据不必随编辑的数据一起移动,不可能篡改原始数据,而且它支持许多客户端,而不必支持UI级别的更改跟踪。您的问题有两个部分:
- 需要更改的对象和字段及其新值
- 上次对数据库中要修改的对象所做的更改
- 从数据库中获取对正在修改的对象的最后更改
- 如果对象已更改,则中止,并将冲突通知用户
- 如果没有,则获取正在更改的字段的当前值
- 保存新值
- 更新审计表
为此,我将使用一个存储过程来减少进程的闲聊,并在数据库代码和应用程序代码之间实现更大的关注点分离。+1当用户在MVC上对对象进行更改(例如,更改1字段属性)时,我如何将该更改从视图发送到DB?您能解释一下吗?为了更清晰起见,请进行编辑,只需将映射回ORM类(实体框架?)并调用
SaveChanges()
。你的问题是什么?@8位:这意味着在运行时,每当特定对象的值发生变化时…,你想通过保存在数据库中来跟踪它吗?我想