nPoco V3 - 多对多不工作

nPoco V3 - many to many not working

我的用户有很多角色

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

我试图实现的是在一次查询中获得具有所有角色的用户,但到目前为止我失败了。 对于映射,我使用自定义的基于约定的映射器(我可以提供代码,但它相当大)

我尝试了 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);  

同样没有帮助,角色是空的。

我不知道我错过了什么。 有什么想法吗?

ComplexMapping 和关系映射(1-to-n, n-to-n) 是两个不同的东西。

ComplexMapping 用于为通常位于同一 table 中且存在一对一关系的数据映射嵌套对象。对于这样的事情:

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

使用基于约定的映射器时需要注意的一件事;您必须使用以下代码在扫描仪中启用 ComplexMapping:

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

否则,覆盖中的 ComplexMapping() 调用将被忽略。

一对多映射将像这样工作(有关更多信息,请参阅 NPoco on 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);