1

由于遗留原因,我不得不调用 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>类中反映这些属性以补充数据行。

有没有人有更好的方法来实现这一点,我可能忽略了这一点?

4

1 回答 1

1

为了任何在这个问题上绊倒的人的利益,我最终按照ITypeConverter合同创建了一个自定义 AutoMapper 转换器。目前我正在为每种实体类型创建一个自定义转换器,所以对于我的示例MyEntity,这就是我所做的:

public class MyEntityToDataTableConvertor : ITypeConvertor<MyEntity, DataTable>
{
    public DataTable Convert(ResolutionContext context)
    {
        MyEntity myEntity = (MyEntity)context.SourceValue;
        DataTable dt = GetDataTableSchema();
        DataRow nr = dt.NewRow();
        nr["property_column"] = myEntity.Property;
        // and so on
        return dt;
    }
}

然后告诉 AutoMapperConvertUsing为:

Mapper.CreateMap<MyEntity, DataTable>()
      .ConvertUsing(new MyEntityToDataTableConvertor ());

我确信我可以对其进行大量重构以使用反射和泛型,但在短期内这对我来说非常有用。

于 2013-02-15T16:03:43.560 回答