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);
我的用户有很多角色
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);