我正在编写一个WPF MVVM应用程序,并且有一个关于从Database Dto对象映射到Model实体的问题。
首先,我没有在这个项目中使用ORM(EF或NH等) - 所以只有一个Oracle Repository包含返回Dto Collections的方法,即
private IList<MyDataDto> LoadData(){
...
}
MyDataDto可能如下所示:
public class MyDataDto
{
public DateTime? MyDate { get; set; }
public string Identifier { get; set; }
public decimal? Value { get; set; }
}
MyDataEntity可能如下所示:
public class MyDataEntity
{
public DateTime? MyDate { get; set; }
public decimal? Toyota { get; set; }
public decimal? Honda { get; set; }
public decimal? Nissan { get; set; }
public decimal? Mazda { get; set; }
}
和我的模特一样:
public class MyModel : INotifyPropertyChanged
{
private IEnumerable<MyDataEntity> modelData;
public IEnumerable<MyDataEntity> ModelData
{
get { return modelData; }
set
{
modelData= value;
OnPropertyChanged("ModelData");
}
}
//other stuff in here but not shown for brevity
}
我有一个Quartz调度程序正在运行,在该作业中它查询数据库并且自定义映射器将Dto集合映射到Entity集合,然后将Entity集合分配给继承自INotifyPropertyChanged接口的Model,以便更改反映在我的用户界面。
MyDataDto中的每个Identifier值等于MyDataEntity中的Property。因此,如果有效的Identifer值是Toyota,则MyDataEntity中的列名称将是Toyota。这些标识符已在查询where子句中指定(它们必须是),因此我知道将检索哪些标识符,并且这些标识符不太可能发生变化(极不可能!)
所以,我的问题是,是否可以拥有像我所示的丑陋实体(将Identifers作为列名),以便映射到数据网格很容易,或者是否有更好的,更优选的方式?
答案 0 :(得分:0)
这就是我最终做的事情:
public class MyDataEntity
{
public DateTime? MyDate { get; set; }
public IDictionary<Identifier, decimal?> IdentifierType { get; set; }
}
public enum Identifer
{
Toyota,
Honda,
Nissan,
Mazda
}
和我的xaml:
<TextBlock Text="{Binding IdentifierType[Toyota]}" />
我的mapper处理从dto到模型实体的转换,结果使我的模型更加整洁,并且工作得非常漂亮!
希望这有助于其他xaml / wpf noobs