我有简单的3个POCO课程:
public class User
{
//PK
public virtual int UserId { get; set; }
//ONE to ONE
public virtual Profil Profil{ get; set; }
//ONE to MANY
public virtual IList<PhotoAlbum> Albums { get; set; }
}
public class Profil
{
//PK
public virtual int ProfilId { get; set; }
public virtual int Age { get; set; }
public virtual int Sex { get; set; }
}
public class PhotoAlbum
{
//PK
public virtual int PhotoAlbumId { get; set; }
public virtual string Name { get; set; }
public virtual int NumberOfPhoto { get; set; }
}
我创建了这些映射类:
public class UserMap : ClassMap<User>
{
public UserMap()
{
//PK
Id(p => p.UserId)
.GeneratedBy.Identity();
//FK
References(p => p.Profil)
.Column("ProfilId")
.Cascade.All();
//ONE TO MANY
HasMany(p => p.Albums)
.Cascade.All();
Table("Users");
}
}
public class ProfilMap: ClassMap<Profil>
{
public ProfilMap()
{
Id(p => p.ProfilId)
.GeneratedBy.Identity();
Map(p => p.Age)
.Not.Nullable();
Map(p => p.Sex)
Table("Profiles");
}
}
public class PhotoAlbumMap : ClassMap<PhotoAlbum>
{
public PhotoAlbumMap()
{
Id(p => p.PhotoAlbumId)
.GeneratedBy.Identity();
Map(p => p.Name)
.Not.Nullable();
Map(p => p.NumberOfPhoto)
.Not.Nullable();
Table("PhotoAlbums");
}
}
然后我用这个方法创建了简单的NHibernate存储库类:
public IList<T> GetItemsByCriterions(params ICriterion[] criterions)
{
ICriteria criteria = AddCriterions(_session.CreateCriteria(typeof(T)),
criterions);
IList<T> result = criteria.List<T>();
return result ?? new List<T>(0);
}
对于测试我为某个实体创建了存储库,例如User:
_userRepo = new NHibRepository<User>(NHibeHelper.OpenSession());
我希望有可能以这种方式进行查询:
var users = _userRepo.GetItemsByCriterions(new ICriterion[]
{
Restrictions.Gt("Profile.Age",10)
});
此尝试以错误结束:
无法解析属性:Profile of:Repository.User
用户拥有Profile的Profile属性类型,此属性具有属性ProfileId,Age 和性。
**#1已编辑:**
@我试过这个:
var users = _userRepo.GetItemsByCriterions(new ICriterion[]
{
Restrictions.Where<User>(u=>u.Profil.Sex==0)
});
完成了错误:
无法解析属性:Profil.Sex of:Repository.User
#2已编辑
我尝试使用内森的建议:
var result = _userRepo.Session.CreateCriteria<User>()
.CreateAlias("Profile", "profile", JoinType.InnerJoin)
.Add(Restrictions.Eq("profile.Sex", 0));
IList<User> users=null;
if (result != null)
users = result.List<User>();
如果我尝试将结果转换为List I再次出现此错误:无法解析属性:Profile of:Repository.User
答案 0 :(得分:1)
查看您的示例,User具有Profil属性而不是Profile属性。
如果它应该是Profil,那么我会将Restrictions.Gt(Profile.Age,10)
更改为Restrictions.Gt(Profil.Age,10)
,否则更改属性的名称和映射以匹配查询。
编辑:
您正在尝试查询用户对象。你需要包含CreateAlias让nhibernate知道你想链接到另一个对象。
试试这个。
var users = session.CreateCriteria<User>()
.CreateAlias("Profile", "profile", JoinType.InnerJoin)
.Add(Restrictions.Eq("profile.Age", 10));