NHibernate-别名和关联

NHibernate-别名和关联,nhibernate,Nhibernate,我有一个实体,看起来像这样: public class MyEntity { public virtual int Id { get; set; } public virtual string Name { get; set ; } public virtual Role UserRole { get; set; } } ICriteria c = Db.CreateCriteria<MyEntity>("m") .CreateAlias("Role", "r") .Se

我有一个实体,看起来像这样:

public class MyEntity {
 public virtual int Id { get; set; }
 public virtual string Name { get; set ; }
 public virtual Role UserRole { get; set; }
}
ICriteria c = Db.CreateCriteria<MyEntity>("m")
 .CreateAlias("Role", "r")
 .SetProjection(Projections.ProjectionList()
 .Add(
  Projections.SqlProjection(@"Name = case TypeId
                    when 2 then (select Name from tblOne where Id = EntityId)
                    when 4 then (select Name from tblTwo where Id = EntityId)
                    when 3 then (select Name from tblThree where Id = EntityId)
                    end", new string[] { "Name" }, new NHibernate.Type.IType[] { NHibernateUtil.String }))
                .Add(Projections.Property("m.Id"), "Id")
                .Add(Projections.Property("r.Id"), "UserRole.Id")
                .Add(Projections.Property("r.Desc"), "UserRole.Desc")
                .Add(Projections.Property("r.Permission"), "UserRole.Permission")
    )
    .SetResultTransformer(Transformers.AliasToBean<EntityPermission>());
属性名称不是映射的属性,但Id和UserRole是。我想使用如下自定义条件填充此类:

public class MyEntity {
 public virtual int Id { get; set; }
 public virtual string Name { get; set ; }
 public virtual Role UserRole { get; set; }
}
ICriteria c = Db.CreateCriteria<MyEntity>("m")
 .CreateAlias("Role", "r")
 .SetProjection(Projections.ProjectionList()
 .Add(
  Projections.SqlProjection(@"Name = case TypeId
                    when 2 then (select Name from tblOne where Id = EntityId)
                    when 4 then (select Name from tblTwo where Id = EntityId)
                    when 3 then (select Name from tblThree where Id = EntityId)
                    end", new string[] { "Name" }, new NHibernate.Type.IType[] { NHibernateUtil.String }))
                .Add(Projections.Property("m.Id"), "Id")
                .Add(Projections.Property("r.Id"), "UserRole.Id")
                .Add(Projections.Property("r.Desc"), "UserRole.Desc")
                .Add(Projections.Property("r.Permission"), "UserRole.Permission")
    )
    .SetResultTransformer(Transformers.AliasToBean<EntityPermission>());
但是,如果执行此操作,它会引发异常,无法在类“MyEntity”中找到属性“{UserRole.Id}”的setter


所以我的问题是aliastobean不支持关联吗?如果它支持关联,正确的语法是什么?

您应该将别名包装到UserRole而不是Role,因为属性的名称是UserRole,而不是Role。

您应该将别名包装到UserRole而不是Role,因为属性的名称是UserRole,而不是Role