Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在N层WCF MVC应用程序中实现对象更改跟踪_C#_Asp.net Mvc_Inotifypropertychanged_N Tier Architecture_Change Tracking - Fatal编程技术网

C# 在N层WCF MVC应用程序中实现对象更改跟踪

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

我在网上看到的大多数示例都显示了WinForms/WPF上下文中的对象更改跟踪。或者,如果它在web上,则使用连接的对象,因此,可以跟踪对每个对象所做的更改

在我的场景中,对象离开数据层后即断开连接(映射到WCF中的业务对象,并映射到MVC应用程序上的DTO)

当用户在MVC上对对象进行更改(例如,更改1字段属性)时,我如何将更改从视图发送到DB

我想要一个审计表,它保存对特定对象所做的更改。我想保存的是仅针对我们修改的属性的对象的前后值

我可以想出一些方法来做到这一点

1) 为MVC层(或javascript?)中的所有模型的每个属性实现IsDirty标志。将该信息一直传播到服务层,最后传播到数据层

2) 在服务层中使用这种更改跟踪机制将非常好,但是在修改后的值从MVC传回之后,我如何跟踪“原始”值呢

3) 数据库触发器?但我不知道如何开始。这可能吗

对于n层mvc wcf解决方案,是否有任何已知的对象更改跟踪实现

审计表示例:

Audit table

Id              Object         Property         OldValue                NewValue
--------------------------------------------------------------------------------------
1               Customer       Name             Bob                     Joe
2               Customer       Age              21                      22

此问题的可能解决方案在很大程度上取决于用户编辑数据时允许在数据库中进行哪些更改

换言之,一旦它“离开”数据库,它是专为用户锁定的,还是其他用户或进程可以同时更新它

例如,如果用户可以获取数据并在其上停留数小时或数天,但数据库仍允许更新数据,则您确实希望跟踪用户对数据库中当前版本所做的更改,而不是用户对其查看的数据所做的更改

我们处理此场景的方法是启动一个事务,读取整个现有对象,然后使用反射比较新旧值,将更改记录到审核日志中。在处理嵌套记录时,这会变得有点复杂,但花在实现上的时间是值得的

另一方面,如果不允许其他用户或进程更改数据,那么您有两个不同的选项,它们在复杂性、数据存储以及对现有数据结构的影响方面都有所不同

例如,您可以修改每个类中的每个属性,以记录其更改的时间,并在类中保留这些更改的运行记录(显然,基类实现在这里有很大帮助)

但是,根据捕获用户更改的时间点(例如,每次用户更新表单中的字段时),这可能会生成大量无用的日志信息,因为您可能只想从数据库角度而不是从UI角度了解更改的内容

您还可以深度克隆对象并将其传递到各个层。然后,当确定发生了什么变化时,您可以再次使用反射。但是,根据业务对象的大小,这种方法可能会造成严重的性能损失,因为必须将完整副本移动到网络上并与原始记录一起保留


您还可以实现与“编辑时允许更新”方法相同的方法。在我看来,这是最干净的解决方案,因为原始数据不必随编辑的数据一起移动,不可能篡改原始数据,而且它支持许多客户端,而不必支持UI级别的更改跟踪。

您的问题有两个部分:

  • 如何在MVC中执行此操作:
  • 通常的方法是:将更改发送回服务器,由控制器处理,等等。。 在您的用例中,要求更改MVC通常的工作方式并不是什么不寻常的事情。 对于您的用例场景来说,最好将更改编码为单独的更改操作,而不是作为修改过的对象,如果您需要使用反射来找出用户所做的任何更改

  • 如何在数据库上执行此操作: 这可能是你想要问的问题:
  • 首先,远离ORM框架,生活太复杂了

    在保存操作的最后一步中,您应具有以下信息:

    • 需要更改的对象和字段及其新值
    您需要跟踪以下信息:

    • 上次对数据库中要修改的对象所做的更改
    这可以从审核表中获得,需要保存在会话(或类似会话的对象)中

    然后,您需要在事务中执行以下操作:

    • 从数据库中获取对正在修改的对象的最后更改
    • 如果对象已更改,则中止,并将冲突通知用户
    • 如果没有,则获取正在更改的字段的当前值
    • 保存新值
    • 更新审计表

    为此,我将使用一个存储过程来减少进程的闲聊,并在数据库代码和应用程序代码之间实现更大的关注点分离。

    +1当用户在MVC上对对象进行更改(例如,更改1字段属性)时,我如何将该更改从视图发送到DB?您能解释一下吗?为了更清晰起见,请进行编辑,只需将映射回ORM类(实体框架?)并调用
    SaveChanges()
    。你的问题是什么?@8位:这意味着在运行时,每当特定对象的值发生变化时…,你想通过保存在数据库中来跟踪它吗?我想