由于遗留原因,我不得不调用 ASMX Web 服务,它给了我一个DataTable
而不是一个实体,然后又将一个数据表传回给 Web 服务。我在这里使用术语实体,但没有 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>
类中反映这些属性以补充数据行。
有没有人有更好的方法来实现这一点,我可能忽略了这一点?