【问题标题】:Automapper mapping issue concerning comma-delimited varchar field关于逗号分隔的 varchar 字段的 Automapper 映射问题
【发布时间】:2015-04-17 20:16:03
【问题描述】:

鉴于以下情况:

SQL:

SuperClassTable
|
 --> NumberSet (varchar(MAX))
     Sample data: '110,111,112,113,114'

SubClassTable
|
 --> NumberSubSet (varchar(MAX))
     Sample data: '110,111,112'

SP_GetClassTables
|
 --> Returns the two tables above joined on an id, based on that id.

型号:

public class SuperClass {
    public IEnumerable<String> NumberSet { get; set; }
}

public class SubClass : SuperClass {
    public IEnumerable<String> NumberSubSet { get; set; }
}

映射器:

var superMapping = CreateMap<DbSuperClass, SuperClass>();
superMapping.ForMember(dest => dest.NumberSet,
                opt =>
                    opt.MapFrom(
                        src =>
                            !String.IsNullOrWhiteSpace(src.numberSet)
                                ? src.numberSet.Split(',')
                                    .Select(s => s.Trim())
                                    .ToEnumerable()
                                : null));

// Both of these map the comma-delimited varchars to 
//     the IEnumerable<String>s in the models.

var subMapping = CreateMap<DbSubClass, SubClass>();
subMapping.ForMember(dest => dest.NumberSubSet,
                opt =>
                    opt.MapFrom(
                        src =>
                            !String.IsNullOrWhiteSpace(src.numberSubSet)
                                ? src.numberSubSet.Split(',')
                                    .Select(s => s.Trim())
                                    .ToEnumerable()
                                : null));

控制器:

public class Repo{
    public SubClass Get(int id) {
        var subClassEntry =
            Context.Database.Query<DbSubClass>("SP_GetClassTables", new {value = id},
                commandType: CommandType.StoredProcedure).FirstOrDefault();
        var entry = Map(subClassEntry); // In-house method to take care of the mapping
        return entry;
    }
}

public class SubClassController {
    protected Repo _repo;
    // ...
    public ActionResult Edit(int id) {
        var model = _repo.Get(id);
        return View(model);
    }
}

查看:

@model SubClass
<p>
    NumberSet: @(Model.NumberSet == null || !Model.NumberSet.Any() ? 
                    "N/A" 
                    : ( Model.NumberSet.Count() > 1 
                        ? String.Join(",", Model.NumberSet) 
                        : Model.NumberSet.FirstOrDefault().Trim() )
                )
</p>
<p>
    NumberSubSet:  @(Model.NumberSubSet == null || !Model.NumberSubSet.Any() ? 
                        "N/A"
                        : ( Model.NumberSubSet.Count() > 1 
                            ? String.Join(",", Model.NumberSubSet) 
                            : Model.NumberSubSet.FirstOrDefault().Trim() )
                    )
</p>

产品:

NumberSet: 1,1,0,,,1,1,1,,,1,1,2,,,1,1,3,,,1,1,4

NumberSubSet: 110,111,112

我几乎完全不知道它为什么会这样做。我尝试从映射器中删除拆分,它创建了同样的逗号。欢迎提出任何想法。

(注意:这是一个更复杂的设计,为了简洁起见,我尽力简化,但我可能在此过程中不小心遗漏了一两个重要细节。提前致歉!)

【问题讨论】:

  • 旁注:我知道在 SQL 的 varchar 字段中存储逗号分隔的整数真的很难看——不幸的是,我们继承了这个数据库,只是没有时间重组它。
  • 我错了,这不是 Dapper 的问题,是 AutoMapper 的问题。

标签: c# sql-server split automapper dapper


【解决方案1】:

我修好了。未在 SuperClass.NumberSet 字段的映射器类中调用映射器配置。愚蠢的错误。

【讨论】:

    猜你喜欢
    • 2018-04-23
    • 2018-03-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    相关资源
    最近更新 更多