Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 在哪里管理多层应用程序中的实体状态更改?_C#_Entity Framework_Wcf_Mvvm_Architecture - Fatal编程技术网

C# 在哪里管理多层应用程序中的实体状态更改?

C# 在哪里管理多层应用程序中的实体状态更改?,c#,entity-framework,wcf,mvvm,architecture,C#,Entity Framework,Wcf,Mvvm,Architecture,我在.Net/C#/EF6/WPF/WCF中构建了一个多层应用程序 后端是一个mysql数据库,有一个实体框架层来访问数据库。我有一个业务逻辑层和一个门面层来公开服务 在客户端,是WPF/MVVM客户端 我有3个模型,一个用于客户端(“视图域”),一个用于实体框架生成的后端(“db域”),还有一个类似dto的模型用于服务 在客户端,我跟踪实体状态的更改,基本上从System.Data复制EntityState枚举,并在属性更改或创建新实体时设置状态 例如,我的一个服务公开了Add(实体e)和Up

我在.Net/C#/EF6/WPF/WCF中构建了一个多层应用程序

后端是一个mysql数据库,有一个实体框架层来访问数据库。我有一个业务逻辑层和一个门面层来公开服务

在客户端,是WPF/MVVM客户端

我有3个模型,一个用于客户端(“视图域”),一个用于实体框架生成的后端(“db域”),还有一个类似dto的模型用于服务

在客户端,我跟踪实体状态的更改,基本上从
System.Data
复制
EntityState
枚举,并在属性更改或创建新实体时设置状态

例如,我的一个服务公开了
Add(实体e)
Update(实体e)

我应该决定调用客户端上的一个或另一个方法(他知道状态是
添加的
还是
修改的
),还是应该公开一个名为
添加或更新(实体e)
的方法,让后端决定它是新实体还是更新实体


最好的方法是什么?我应该在客户端还是后端对此做出决定?

不确定您为什么希望客户端知道/处理对象的状态。
您的问题可能是由于在两种方法中都重用了“实体”类而引起的

我想你可以用这样的东西:

 Add(InputResource e) 
 Update(UpdateResource e) 
上述任何一项都不应具有“状态”属性*
“InputResource”也不应具有Id/主键

我认为上述方法更简洁,但这取决于您的需要。
如果您想使用“AddOrUpdate”,我仍然认为添加状态不是一个好主意。
您可以检查Id属性,如果设置了它,则它是一个更新,如果没有设置,则它是一个添加

*当然,我说的是您的公共API。

在内部,在您的服务器(BusinessLayer DataLayer)上,您可能有一个根据项目状态处理项目的解决方案,但我认为您没有考虑这个问题

如果您有多层应用程序和数据访问层,您应该验证和控制数据访问层中行的状态,但在entityframwork中,您不需要控制实体的状态(如数据集状态),您可以调用save changes来提交所有更改,但如果您需要控制状态,您可以在facade中进行控制,然后决定最适合我的数据访问方法或规则层,一个更重要的问题是客户是否应该进行更改跟踪。从技术上讲,客户端总是有过时的数据,因此每个数据点都有可能被“修改”,即使客户端不知道这一点。只有服务器适合于比较当前状态。此外,该服务不能信任每个客户端都能正确地执行操作,因此无论如何它都必须检查/验证更改。您可以控制facade中的状态,然后如果需要调用规则层和规则调用dataaccess层,如果需要将错误返回到表示层,则无需转到规则层或dataaccess层。。。2.另一种方法是使用http模块检查这种情况。在这种情况下,您没有虚假的服务呼叫。。。