【问题标题】:Converting an entity / model back to DataTable将实体/模型转换回 DataTable
【发布时间】: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&lt;T&gt; 类中反映这些属性以补充数据行。

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

【问题讨论】:

    标签: c# datatable automapper


    【解决方案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 ());
    

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

    【讨论】:

    • 我很奇怪,使用反射比简单的硬编码映射要快一点。
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多