27

如何使用 dapper/dapper extensions/dapper rainbow 或任何方法忽略模型上的属性

那些精巧的图书馆?

4

5 回答 5

28

Dapper.Contrib 内置支持将列标记为已计算:添加 ComputedAttribute 以允许在 Insert 上支持计算列。以下是它的工作原理:

class MyModel
{
  public string Property1 { get; set; }

  [Computed]
  public int ComputedProperty { get; set; }
}

用该属性标记的Computed属性将在插入时被忽略。

于 2014-11-05T20:19:57.520 回答
16

Dapper 创建者 Sam Saffron 已在此处回答另一个 SO 用户的问题,从而解决了此要求。一探究竟。

此外,如果您想使用Sam 在他的回答中提到的Dapper Extensions 库,您可以从 Github 或通过 Nuget 获得它。

这是一个忽略图书馆测试项目中的属性的示例。

using System;
using System.Collections.Generic;
using DapperExtensions.Mapper;

namespace DapperExtensions.Test.Data
{
    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public DateTime DateCreated { get; set; }
        public bool Active { get; set; }
        public IEnumerable<Phone> Phones { get; private set; }
    }

    public class Phone
    {
        public int Id { get; set; }
        public string Value { get; set; }
    }

    public class PersonMapper : ClassMapper<Person>
    {
        public PersonMapper()
        {
            Table("Person");
            Map(m => m.Phones).Ignore();
            AutoMap();
        }
    }
}
于 2013-11-02T00:58:18.243 回答
10

就我而言,我使用了Dapper.Contrib.
在任何属性上使用[Write(false)]属性应该可以解决问题。有些人还建议使用[Computed]属性。

public class Person
{        
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }

    [Write(false)]
    public IEnumerable<Email> Emails { get; }
}
于 2017-05-08T15:58:40.420 回答
5

您可以设计一个没有计算属性的基类并将其用于插入。

  class BasePerson
    {
      public String Name {get;set;}
    }

    class Person: BasePerson
    {
     public String ComputedProperty {get;set;}
    }

    Insert<BasePerson>(person);
于 2013-11-01T13:30:50.223 回答
4

对于那些不想包含 DapperExtensions的人,也可以使用DatabaseGenerated标准中的。System.ComponentModel.DataAnnotations.Schema

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
于 2017-07-19T15:04:28.457 回答