Как использовать Dapper.FluentMap.Dommel.Mapping для нескольких идентификаторов

У меня проблема с использованием Dapper.FluentMap.Dommel.Mapping, Когда я регистрирую сопоставление, система определяет, что свойство с идентификатором имени уже существует, и выдает исключение. Но сопоставленный идентификатор принадлежит другому объекту. Как я могу решить эту проблему?

BaseEntity.cs

public abstract class BaseEntity
{
    public virtual long Id { get; set; }
}

Sistema.cs

public class Sistema : BaseEntity
{        
    public override long Id { get; set; }
    public string Nome { get; set; }
}

Arquivo.cs

public class Arquivo : BaseEntity
{
    public override long Id { get; set; }
    public Sistema Sistema { get; set; }
    public Banco Banco { get; set; }
    public List<Error> Erros { get; set; }
    public string FullPath { get; set; }
    public DateTime DtProcessamento { get; set; }
    public int QtRegistros { get; set; }
    public Decimal VlTotal { get; set; }
    public int Sequencial { get; set; }
    public bool isValid { get; set; }
    public TipoComunicacao tipoComunicacao { get; set; }
}

ArquivoMap.cs

public class ArquivoMap : DommelEntityMap<Entities.Arquivo>
{
    public ArquivoMap()
    {
        ToTable("Arquivo");

        Map(a => a.Id).ToColumn("arqu_id").IsKey();

        this.Map(a => a.Sistema.Id).ToColumn("sist_id"); //<-- Problm (1)
        this.Map(a => a.Banco.Id).ToColumn("banc_id");
        //this.Map(a => a.Erros).ToColumn("erro_id"); // 
        this.Map(a => a.FullPath).ToColumn("arqu_nm_fullPath");
        this.Map(a => a.DtProcessamento).ToColumn("arqu_dt_processamento");
        this.Map(a => a.QtRegistros).ToColumn("arqu_qt_registros");
        this.Map(a => a.VlTotal).ToColumn("arqu_vl_total");
        this.Map(a => a.Sequencial).ToColumn("arqu_id_sequencial");
        this.Map(a => a.isValid).ToColumn("arqu_bt_valid");
        this.Map(a => a.tipoComunicacao).ToColumn("arqu_cd_comunicacao");
    }
}

RegisterMappings.cs

public static void Register()
{
    FluentMapper.Initialize(config =>
    {
        config.AddMap(new ArquivoMap()); //<-- Call to map
        config.AddMap(new BancoMap());
        config.AddMap(new ErrorMap());
        config.AddMap(new SistemaMap());
        config.ForDommel();
    });
}

Ошибка:

System.Exception: 'Обнаружено дублирование сопоставления. Свойство 'Id' уже сопоставлено с колонкой 'Id'. '

1 ответ

Вы должны отобразить каждый класс отдельно, сначала вам нужно игнорировать свойство Системы в вашем классе ArquivoMap:

this.Map(a => a.Sistema).Ignore();

Затем создайте отдельный класс с картой для класса Система:

    public class SistemaMap : DommelEntityMap<Entities.Sistema>{
    public SistemaMap()
    {
        ToTable("Sistema");        
        this.Map(a => a.Id).ToColumn("sist_id");
    }
}

Сделайте это с каждым подобъектом класса. Затем, чтобы сделать запрос, вам нужно выполнить MultiQuery - Mapping, чтобы получить объект, отображенный из базы данных:

var arquivoList=    yourConnection.Query<Arquivo,Sistema, Arquivo>(sqlQuery, 
(arquivo, sistema)=>{
        arquivo.Sistema= sistema;
        return arquivo;
    });
    return arquivoList;

Подробности о том, как сделать несколько запросов, можно найти по этой ссылке: http://dapper-tutorial.net/result-multi-mapping

Если у вас есть объединение в вашем запросе, возможно, вам нужно использовать свойство splitOn. В этом посте очень хорошо объясняется, как это сделать: правильное использование Multimapping в Dapper

Я надеюсь, что это может помочь.

Другие вопросы по тегам