2017-06-27 2 views
0

J'ai un problème avec Dapper.FluentMap.Dommel.Mapping. Lorsque je consigne le mappage, le système identifie qu'une propriété avec l'ID de nom existe déjà et lève l'exception. Mais l'Id mappé appartient à un autre objet. Comment puis-je résoudre ce problème?Comment utiliser Dapper.FluentMap.Dommel.Mapping pour plusieurs ID

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(); 
    }); 
} 

Erreur:

System.Exception: 'Duplicate mapping detected. Property 'Id' is already mapped to column 'Id'.'

Répondre

1

Vous devez mapper chaque classe séparée, vous devez d'abord ignorer la propriété de Sistema dans votre classe ArquivoMap:

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

Créez ensuite une classe distincte avec la carte pour la classe Sistema:

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

Faites-le avec chaque sous-objet de la classe. Ensuite, pour faire la requête que vous devez faire une MultiQuery - Mapping pour obtenir l'objet mis en correspondance à partir de la base de données:

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

Vérifiez les détails comment faire MultiQuery dans ce lien: http://dapper-tutorial.net/result-multi-mapping

Si vous avez une jointure Dans votre requête, vous devrez peut-être utiliser la propriété splitOn. Dans ce post explaint très bien comment le faire: Correct use of Multimapping in Dapper

J'espère que cela peut aider.