【发布时间】:2013-02-11 09:54:43
【问题描述】:
由于遗留原因,我不得不调用 ASMX Web 服务,它给了我一个 DataTable 而不是实体,然后又将数据表传回给 Web 服务。我在这里使用术语 entity,但没有 ORM,因为整个数据层 (CRUD) 都是由这些 Web 服务完成的。我只是调用一个 web 方法,它给了我一个数据表,将这个数据表转换为一个实体,更新实体,转换回一个数据表,然后最后将这个数据表传递给一个 web 方法。
目前我正在使用 AutoMapper 将数据表的行转换为带有 Profile 的实体:
Mapper.CreateMap<DataRow, MyEntity>()
.ForMember(d => d.Property, o => o.MapFrom(s => s["property_column"]))
// and so on
效果很好,但是我想做的让实体回到数据表行是使用这个Profile(不幸的是它不起作用):
Mapper.CreateMap<MyEntity, DataRow>()
.ForMember(d => d["property_column"], o => o.MapFrom(s => s.Property))
// and so on
所以,因为 AutoMapper 无法做到这一点,我认为我将不得不使用反射 - 但这给我带来了另一个问题。我的实体属性名称与我的数据行的列名称不匹配。所以我不能简单地DataRow[PropertyInfo.Name] = value。
我正在考虑使用EntityTypeConfiguration 类(对于每个实体)将属性映射到目标列,但这意味着我需要在我的项目中引用实体框架——我希望避免这种情况因为它不会被使用。我的第二个(也是首选)想法是为包含目标列名称的实体创建自定义属性,并在我的 ConvertToDataTable<T> 类中反映这些属性以补充数据行。
有没有人有更好的方法来实现这一点,我可能忽略了这一点?
【问题讨论】:
标签: c# datatable automapper