【问题标题】:Is there an equivalent to "NotMapped" for Dapper.Net and the Dapper.Net extensions?Dapper.Net 和 Dapper.Net 扩展是否有等效于“NotMapped”的方法?
【发布时间】:2012-09-25 04:28:48
【问题描述】:

我已经开始使用 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 不希望从 DB 中获得一列?这是扩展的问题吗,试图为它在模型 POCO 中看到的所有内容映射一个 DB 列?我是否需要重新编写 SQL,并明确询问我只想要的列,或者有没有办法在列上获得与 NotMapped 等效的列?

【问题讨论】:

  • 我越是研究这个,我就越认为这是 Dapper Extensions 的产物,而不是 Dapper.Net 本身。看来,如果我使用核心 Dapper 的东西,并显式构建一个列列表, 使用通配符 (*),我也没有问题。只有在使用 GetList 扩展时才会出现这个问题——它似乎会询问类(通过反射?)并建立期望每个公共属性在表中都有一个匹配的列......

标签: dapper micro-orm


【解决方案1】:

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

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 类相同的程序集中。该库使用反射来查找自定义映射,它只扫描一个程序集。

希望这会有所帮助, 祝你好运

【讨论】:

  • 谢谢!这正是我想要的——虽然它比我希望的要重一些...... :)
猜你喜欢
  • 2014-08-30
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多