nPoco V3 — много ко многим не работает

У меня есть пользователи, у которых много ролей

public class User 
{
   public int Id {get;set;}
   public string Name {get;set;}
   public List<Role> Roles {get;set;}
}

public class Roles 
{
   public int Id {get;set;}
   public string Key{get;set;}
}

public class UserRoles 
{
   public int UserId {get;set;}
   public int RoleId {get;set;}
}

я пытаюсь получить пользователя со всеми его ролями в одном запросе, но пока мне это не удалось.
Для картографирования я использую пользовательский конвенционный mapper (я могу предоставить код, но он довольно большой)

Я пытался FetchOneToMany и я пытался Fetch как описано здесь

https://github.com/schotime/NPoco/wiki/One-to-Many-Query-Helpers
https://github.com/schotime/NPoco/wiki/Version-3

Но роли всегда пусты.
Роль и пользователь сами по себе отображаются правильно, и я пытался указать отношение, как

For<User>().Columns(x =>
        {
            x.Many(c => c.Roles);
            x.Column(c => c.Roles).ComplexMapping();
        }, true);  

Опять не помогло, роли пустые.

Я понятия не имею, чего мне не хватает.
Есть идеи?

1 ответ

  1. Комплексное сопоставление и сопоставление отношений (1-к-n, n-к-n) — это две разные вещи.

    ComplexMapping предназначен для отображения вложенных объектов для данных, которые обычно находятся в одной таблице, где существует связь один-к-одному. Для чего-то вроде этого:

    public class Client 
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Address Address { get; set; }
    
        public Client()
        {
            Address = new Address();
        }
    }
    
    public class Address
    {
        public string Street { get; set; }
        public string City { get; set; }
        public string PostalCode { get; set; }
        public string Telephone { get; set; }
        public string Country{ get; set; }
    }
    

    Если вы используете сопоставитель на основе конвенции, переопределение будет выглядеть примерно так:

     For<Client>().Columns(x =>
     {
         x.Column(y => y.Address).ComplexMapping();
     });
    

    При использовании картографа на основе конвенции следует обратить внимание на то, что в сканере необходимо включить комплексное сопоставление со следующим кодом:

    scanner.Columns.ComplexPropertiesWhere(y => ColumnInfo.FromMemberInfo(y).ComplexMapping);
    

    В противном случае вызовы ComplexMapping() в ваших переопределениях будут просто игнорироваться.

    Сопоставление «один ко многим» будет работать так (Подробнее см. NPoco на Github):

    For<One>()
        .TableName("Ones")
        .PrimaryKey(x => x.OneId)
        .Columns(x =>
        {
            x.Column(y => y.OneId);
            x.Column(y => y.Name);
            x.Many(y => y.Items).WithName("OneId").Reference(y => y.OneId);
        }, true);
    
    For<Many>()
        .TableName("Manys")
        .PrimaryKey(x => x.ManyId)
        .Columns(x =>
        {
            x.Column(y => y.ManyId);
            x.Column(y => y.Value);
            x.Column(y => y.Currency);
            x.Column(y => y.OneId);
            x.Column(y => y.One).WithName("OneId").Reference(y => y.OneId, ReferenceType.OneToOne);
        }, true);