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

时间:2013-08-08 10:31:25

标签: .net wcf

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

2 个答案:

答案 0 :(得分:0)

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

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

但是,您处理此问题,我认为您需要对数据协定类型进行更改,以便为每个属性包含HasChanged标志。然后在客户端更新属性时,他们还需要设置HasChanged标志。

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

当然,另一种方法是让服务查询任何针对数据库的请求以查看更改的内容。

答案 1 :(得分:0)

如果你不想像Hugh所说的那样改变你的模型被传递出服务,另一种选择是将收到的模型与当前的DB数据进行比较。这是一个简单的方法,需要手动维护(更不用说额外的DB命中),但它将完成工作。 (请记住,以下代码是空中编码的)

假设这个类:

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");
  }
}

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