0

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

4

2 回答 2

0

如果您将某个类型的实例作为服务操作请求的一部分发送,WCF 没有任何内置方法可以知道属性是否不同,即使客户端发送回接收到的类型的相同实例也是如此早期服务响应的一部分。

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

无论您如何处理此问题,我认为您将需要更改您的数据合同类型,以便为您的每个属性包含一个 HasChanged 标志。然后在客户端更新属性时,他们还需要设置 HasChanged 标志。

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

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

于 2013-08-08T11:32:51.517 回答
0

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

假设这个类:

public class MyData
{
  public int ID { get; set; }
  public string Name { get; set; }
  public bool IsEnabled { get; set; }
}

您将有一个Update(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");
  }
}

您也可以使用反射来完成这个中间块(检查每个属性)。无论哪种方式,它都不漂亮,但它可以完成这项工作,而无需更改服务的现有输出。

于 2013-08-09T12:35:37.057 回答