将实体/模型转换回DataTable

时间:2013-02-11 09:54:43

标签: c# datatable automapper

由于遗留原因,我不得不调用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(遗憾的是这不起作用):< / p>

Mapper.CreateMap<MyEntity, DataRow>()
    .ForMember(d => d["property_column"], o => o.MapFrom(s => s.Property))
    // and so on

所以,因为AutoMapper无法做到这一点我想想我将不得不使用反射 - 但这会带给我另一个问题。我的实体属性名称与我的数据行的列名称不匹配。所以我不能简单地DataRow[PropertyInfo.Name] = value

我在考虑使用EntityTypeConfiguration类(针对每个实体)将属性映射到目标列,但这意味着我需要在项目中引用Entity Framework - 我更喜欢避免因为它不会被使用。我的第二个(也是首选)想法是为我的实体创建包含目标列名称的自定义属性,并在我的ConvertToDataTable<T>类中反映这些属性以水合数据行。

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

1 个答案:

答案 0 :(得分: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;
    }
}

然后告诉AutoMapper ConvertUsing

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

我确信我可以使用反射和泛型来重构这一点,但从短期来看,这对我来说非常有用。