忽略模型属性的属性

Eli*_*eth 21 dapper dapper-rainbow dapper-extensions

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

那些精致的图书馆?

Ben*_*ins 22

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

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

  [Computed]
  public int ComputedProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Computed插入时将忽略使用该属性标记的属性.

  • 在我看来,它们的含义有所不同-“ [计算]”的意思是“此列位于数据库中,但是是[计算列]](https://docs.microsoft.com/zh-cn/sql/relational-databases/tables / specify-computed-columns-in-a-table?view = sql-server-2017)“,但是`[Write(false)]`表示“此列不在数据库中” (4认同)
  • @vaheeds我最好的猜测是,它们是在不同的时间被不同的人添加的,这些人可能没有意识到对方。我添加了“计算”属性,当时不知道任何“写”属性。 (2认同)

Shi*_*iva 10

小巧玲珑的创作者萨姆藏红花是应解决了这个要求,其他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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • Where /何时实例化PersonMapper类?dapper扩展是通过获取entityname +"Mapper"字符串并尝试实例化来寻找Mapper类的吗? (2认同)
  • 是的,我相信Dapper Extensions的AutoMapper功能寻找单一的实体名称+"Mapper"后缀来自动忽略字段,具有不同名称的字段等.换句话说,我认为(没有尝试过)你应该没问题只是定义这个PersonMapper类并忽略你想要从POCO中忽略的字段.请参阅此处的文档:https://github.com/tmsmith/Dapper-Extensions/wiki/AutoClassMapper (2认同)

Ari*_*lam 8

在我的情况下,我用过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; }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*lex 5

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

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

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

    Insert<BasePerson>(person);
Run Code Online (Sandbox Code Playgroud)


dav*_*dem 5

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

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案不适用于 .NET CORE 上的 Dapper 1.50.2 (2认同)