c#property collection / flagging

时间:2013-09-10 05:54:36

标签: c# database-design

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

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

任何有关我如何做到这一点(以及可能的话)的帮助都将受到高度赞赏!

2 个答案:

答案 0 :(得分:1)

我认为View Model适合这里。

ViewModel是视图的抽象或数据的概念状态,而不是模型中数据的真实状态。

所以在这种情况下,你会有一个类:

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) Explained
How we do MVC – View models What is ViewModel in MVC?

尽管文章指向MVC / MVVM UI架构,但视图模型是一个非常普遍的概念。

答案 1 :(得分:1)

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

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