我遇到的情况是,我的数据类是由具有各种属性的数据库生成的,例如我无法修改。
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)
}
任何有关我如何做到这一点(以及可能的话)的帮助都将受到高度赞赏!
答案 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。
然后,我再次邀请您重新考虑您的断言,即更新完整的属性集是低效的,假设它们是简单类型。写入数据库中的整行通常并不比编写单个列更昂贵。在你描述的情况下,我会更关注并发性。