AutoMapper将IEnumerable映射到DataReader的问题

6
我正在使用AutoMapper将数据读取器转换为代码,如下所述: http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/ 我发现它非常不稳定和不可预测。 1)有时相同的代码和相同的数据读取器会将值返回到DTO结果集中,有时则不会。 2)我从数据库获取的ID值为100、200。当它映射到类型为整数的DTO时,这个100会变成一个很大的值(比如234343211)。
你对为什么会出现这种不一致性有什么想法吗?我应该使用标准的while (reader.Read()) 吗?还是停止使用AutoMapper?

1
嗯...非常奇怪...你能否给我发送一些示例数据和演示问题的示例源对象?这应该有助于我缩小范围。谢谢! - Jimmy Bogard
1个回答

18

我也遇到了同样的问题。当源类型和目标类型不完全相同时,似乎会出现这种情况。

在我的情况下,我有一个 SQL Server 表,其中 ID 字段的类型为 INT。该值被映射到一个属性类型为 long(Int64)的类中。这将导致预期值 100 被映射为类似于 668386727769314912 的值。在更改表模式以使 ID 成为 BIGINT 后,所有值都能正确地映射。

我建议仔细查看源类型和目标类型,确保它们完全相同。显然,你期望隐式工作的转换(例如 Int32 到 Int64)可能会导致问题。

以下是一个可以重现此问题的示例:

public class DataMapperIssue
{
    public class Person
    {
        public long id { get; set; }
        public string first_name { get; set; }
        public string last_name { get; set; }
    }

    public static void run()
    {
        var table = new DataTable();

        table.Columns.Add("id", typeof(int));
        table.Columns.Add("first_name", typeof(string));
        table.Columns.Add("last_name", typeof(string));

        table.Rows.Add(100, "Jeff", "Barnes");
        table.Rows.Add(101, "George", "Costanza");
        table.Rows.Add(102, "Stewie", "Griffin");
        table.Rows.Add(103, "Stan", "Marsh");
        table.Rows.Add(104, "Eric", "Cartman");

        AutoMapper.Mapper.Reset();
        AutoMapper.Mapper.CreateMap<IDataReader, Person>();

        var results = AutoMapper.Mapper.Map<IDataReader, IList<Person>>(table.CreateDataReader());
    }
}

你使用的是哪个版本的 AutoMapper? - Xtian11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接