Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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
.net 如何确定WCF中的属性是否已更改_.net_Wcf - Fatal编程技术网

.net 如何确定WCF中的属性是否已更改

.net 如何确定WCF中的属性是否已更改,.net,wcf,.net,Wcf,我有一个由Java编写的客户端调用的WCF服务。该服务可以编辑我们数据库中的模型。虽然模型有很多属性,但我希望用户只设置除了ID属性之外还需要更改的属性。问题是:在我的服务端,如何确定属性是否已更改 如果将类型的实例作为服务操作请求的一部分发送,则WCF没有任何内置方式来知道属性是否不同,即使客户端正在发回作为早期服务响应的一部分接收的类型的相同实例 为了确定这一点,WCF必须以某种方式在请求之间将类型实例保留在内存中,并具有某种机制将任何接收到的实例与内存中相应的实例关联起来 不管您如何处理这

我有一个由Java编写的客户端调用的WCF服务。该服务可以编辑我们数据库中的模型。虽然模型有很多属性,但我希望用户只设置除了ID属性之外还需要更改的属性。问题是:在我的服务端,如何确定属性是否已更改

如果将类型的实例作为服务操作请求的一部分发送,则WCF没有任何内置方式来知道属性是否不同,即使客户端正在发回作为早期服务响应的一部分接收的类型的相同实例

为了确定这一点,WCF必须以某种方式在请求之间将类型实例保留在内存中,并具有某种机制将任何接收到的实例与内存中相应的实例关联起来

不管您如何处理这个问题,我认为您需要对数据契约类型进行更改,以便为每个属性包含一个HasChanged标志。然后,在客户机上,当他们更新属性时,他们还需要设置HasChanged标志

但是,这需要作为使用您的服务时要遵守的约定传达给您的客户,您将无法实际执行此用法


当然,服务的另一种选择是询问针对数据库的任何请求,以查看发生了什么变化

如果您不想按照Hugh的建议更改正在从服务中传递出去的模型,另一种选择是将接收到的模型与当前数据库数据进行比较。这是一种简单的方法,需要手动维护(更不用说添加DB命中),但它可以完成工作。(请记住,下面的代码是空编码的)

假设这一类:

public class MyData
{
  public int ID { get; set; }
  public string Name { get; set; }
  public bool IsEnabled { get; set; }
}
您可以使用
更新(MyData data)
方法,并执行如下操作:

public bool Update(MyData data)
{
  MyData current = null;

  //Do Database Retrieval here for current DB Data.

  if (MyData != null)
  {
    //Record already exists, update.
    if (current.Name != data.Name)
    {
       //Update the Name field for this record.
    }
    if (current.IsEnabled != data.IsEnabled)
    {
      //Update the IsEnabled field for this record.
    }
  }
  else
  {
    //Record doesn't exist.
    throw new ApplicationException("Record not found");
  }
}
您还可以使用反射来执行中间块(检查每个属性)。无论哪种方式,它都不好看,但它可以在不需要更改服务现有输出的情况下完成工作