0

我有一种情况,我有由数据库生成的数据类,这些数据类具有各种属性,例如我无法修改。

public DataClass
{
    public string PropertyX {get; set;}
    public int PropertyY {get; set;}
    public float PropertyZ {get; set;}

}

其中一些类可能有 20 个左右的属性。更新数据时,会制作“持久”数据的“瞬态”副本,然后在瞬态上更新属性并将其从瞬态复制到持久。

这很好,虽然如果只改变一个属性不是很有效。

我想知道在 c# 中是否有一种方法可以创建标记属性列表或将属性添加到我希望更新的某些标记属性上。

所以最终结果是(请注意这都是伪的)

 DataClass transientObj = new DataClass(Transient);
 [FlagPropertyToUpdate] //This is the bit I have no idea how to do
 transientObj.propertyX = "updateOnlyMe!";
 DataClass persistantObj = new DataClass(Persistant);
 UpdateData dataUpdater = new UpdateData(transientObj,persistantObj)

 dataUpdater.save();

 public UpdateData 
 {
      public void save(){
          //some how know to only update propertyX and not all three properties
      }  
      public UpdateData(DataClass trans, DataClass pers)
 }

任何关于我如何去做这件事(如果可能的话)的帮助将不胜感激!

4

2 回答 2

1

我认为 View Model 适合这里。

ViewModel 是 View 的抽象或数据的概念状态,而不是 Model 中数据的真实状态。

所以在这种情况下,你将有一个像这样的类:

public DataClassViewModel
{
    //Define all relevant properties here.
    ...
    public DataClassViewModel(DataClass model) //Constructor
    {
       //Initialize the view model from the model. 
    }

    public DataClass GetModel()
    {
       //Depending on changes in the view model, model could be updated here.
    }

    public void UpdateData()
    {
    }
}

您可以在此处阅读有关视图模型的更多信息:

Model-View-ViewModel (MVVM) 解释
我们如何做 MVC – 查看模型 MVC 中的 ViewModel 是什么?

虽然文章指向 MVC/MVVM UI 架构,但视图模型是一个相当笼统的概念。

于 2013-09-10T06:31:52.787 回答
1

我建议创建一个支持脏标记相关属性的 DTO(数据传输对象)。这样你的类就可以保持不变。看看Automapper

再说一次,我会邀请您重新考虑您的断言,即更新完整的属性集是低效的,假设它们是简单类型。写入数据库中的整行通常不会比写入单个列更昂贵。在您描述的情况下,我会更关心并发性。

于 2013-09-10T06:41:45.423 回答