2

我已经开始使用 Dapper.Net,并且到目前为止我真的很喜欢它 - 但是,我遇到了一个问题。

假设我有一个 POCO 类,例如:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName { get { return FirstName + " " + LastName; } }
}

现在,使用 Dapper.Net 和 Dapper.Net 扩展,我想通过执行以下操作从数据库中加载该数据类型的所有实例:

string connectionString = CloudConfigurationManager.GetSetting("DBConnection");
using (SqlConnection cn = new SqlConnection(connectionString))
{
    cn.Open();

    IEnumerable<Types.Person> entities = cn.GetList<Types.Person>();
    var forceMe = entities.ToList();
}

这在 Linq 设置中可以正常工作,但是当它使用 .ToList() 来强制评估时,它会在 FullName 上显示“无效的列名”。考虑到它可能尊重 NotMapped 的实体框架 DataAnnotations 内容,我尝试添加一个 NotMapped 属性(在将 EF 5 添加到项目之后)。这没有用。

所以,问题是,我如何告诉 Dapper.Net 不希望从数据库中获得一列?这是扩展的问题吗,试图为它在模型 POCO 中看到的所有内容映射一个 DB 列?我是否需要恢复编写 SQL,并明确询问我只想要的列,或者有没有办法在列上获得与 NotMapped 等效的列?

4

1 回答 1

5

我认为忽略某些属性被映射的唯一方法是实现一个自动类映射器,您可以在其中指定您的自定义字段映射。例如:

public class CustomMapper : ClassMapper<Foo>
{
    public CustomMapper()
    {
        Table("FooTable");
        Map(f => f.Id).Column("FooId").Key(KeyType.Identity);
        Map(f => f.DateOfBirth).Column("BirthDate");
        Map(f => f.FirstName).Column("First");
        Map(f => f.LastName).Column("Last");
        Map(f => f.FullName).Ignore();
        Map(f => f.Calculated).ReadOnly();
    }
}

public class Foo
{
    public int Id { get; set; }
    public DateTime DateOfBirth { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName
    {
        get { return string.Format("{0} {1}", FirstName, LastName); }
    }
}

在上面的示例中,FullName 被忽略。

自动映射器还允许您调整表名,以防您的 POCO 类名与表名不匹配。

另外,请记住,您必须将自定义地图与 POCO 类放在同一个程序集中。该库使用反射来查找自定义地图,它只扫描一个程序集。

希望这有帮助,祝你好运

于 2012-09-25T16:56:19.957 回答