Игнорировать свойство в свойстве модели

Как я могу игнорировать свойство моей модели, используя dapper/dapper extensions/dapper Rainbow или любой другой?

из этих щеголеватых библиотек?


person Elisabeth    schedule 31.10.2013    source источник
comment
Для Вставить‹Лицо›(человек). человек имеет вид вычисляемой собственности. Который не принадлежит базе данных.   -  person Elisabeth    schedule 01.11.2013
comment
Поскольку ни один из приведенных ниже ответов не дает решения для проекта на основе Dapper.Rainbow, я добавляю этот комментарий. Dapper Rainbow имеет атрибут IgnoreProperty, который можно использовать. Ваш класс POCO должен ссылаться на Dapper.Rainbow.{SQL}, а затем вы можете использовать [IgnoreProperty(true)] для свойств, которые вы хотите исключить.   -  person Vishnoo Rath    schedule 24.11.2015
comment
Связано с Dapper.Contrib: stackoverflow.com/q/57673107/5779732   -  person Amit Joshi    schedule 28.05.2020


Ответы (5)


Создатель Dapper Сэм Саффрон ответил на это требование в ответ на вопросы другого пользователя SO здесь. Проверьте это.

Кроме того, если вы хотите использовать библиотеку расширений Dapper, которую Сэм упомянул в своем ответе, вы можете получить его из 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();
        }
    }
}
person Shiva    schedule 02.11.2013
comment
Где/когда вы создаете экземпляр класса PersonMapper? Расширения dapper ищут класс Mapper, беря строку entityname + Mapper и пытаясь создать ее экземпляр? - person Elisabeth; 02.11.2013
comment
Да, я считаю, что функция AutoMapper в Dapper Extensions ищет единственное имя объекта + суффикс Mapper для автоматического сопоставления полей, которые следует игнорировать, поля с разными именами и т. д. Другими словами, я думаю (не пробовал), вы должны быть в порядке, просто определив этот класс PersonMapper и игнорирование полей, которые вы хотите игнорировать из POCO. См. документацию здесь: github.com/tmsmith/Dapper-Extensions/wiki/AutoClassMapper - person Shiva; 03.11.2013
comment
Хорошо, это сработало для меня. Мой класс XXXMapper имеет такое же пространство имен. - person Elisabeth; 03.11.2013

Dapper.Contrib имеет встроенную поддержку пометки столбца как вычисляемого: поддержка вычисляемых столбцов в Insert. Вот как это работает:

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

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

Свойства, отмеченные атрибутом Computed, будут игнорироваться при вставке.

person Ben Collins    schedule 05.11.2014
comment
Также есть атрибут [Write(false)]. Кто-нибудь может сказать, в чем разница между [Computed] и [Write(false)]? - person vaheeds; 04.04.2017
comment
@vaheeds, я думаю, что они были добавлены в разное время разными людьми, которые, возможно, не знали о другом. Я добавил атрибут Computed и в то время не знал ни о каком атрибуте Write. - person Ben Collins; 09.05.2017
comment
На мой взгляд, они означают что-то другое - [Computed] означает, что этот столбец находится в базе данных, но является Вычисляемый столбец, но [Write(false)] означает, что этого столбца нет в базе данных - person stuartd; 05.12.2018
comment
Подробнее о [Write(false)] и [Computed] см. этот вопрос. - person Amit Joshi; 06.10.2020


Вы можете разработать базовый класс без свойства вычислений и использовать его для своих вставок.

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

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

    Insert<BasePerson>(person);
person Alex    schedule 01.11.2013

Для тех, кто не хочет включать DapperExtensions, можно также использовать DatabaseGenerated из стандартного System.ComponentModel.DataAnnotations.Schema.

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
person davidmdem    schedule 19.07.2017
comment
Это решение не работает с Dapper 1.50.2 на .NET CORE. - person Gilberto Alexandre; 31.07.2017
comment
Это не сработало для вставки/обновления в Dapper.Contrib - person Raman Zhylich; 29.05.2020
comment
Использование стандартных аннотаций вместо пользовательских атрибутов должно быть предпочтительным выбором для Dapper.Contrib. - person Jamie Pearcey; 01.02.2021