У меня есть класс (Project), который представляет собой несколько большую таблицу DB. Мне нужно получить только около десятка столбцов, в дополнение к подклассу (ProjectUses, который представляет другую таблицу DB с соотношением 1: 1 с Project). Я могу получить одиночные столбцы объекта Project просто отлично, используя прогнозы, как показано ниже, но у меня возникают проблемы с возвратом объекта Project с подклассом ProjectUses. Может ли кто-нибудь указать мне в правильном направлении?Выбор столбцов И подкласс с плавным nhibernate
Вот код хранилища Я использую:
public Project GetProjectDebenture(int pkProjectID)
{
var proj = _session.CreateCriteria(typeof(Project))
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("pkProjectID"), "pkProjectID")
.Add(Projections.Property("ReservePercentage"), "ReservePercentage")
.Add(Projections.Property("FundingFeePercentage"), "FundingFeePercentage")
.Add(Projections.Property("PackagingFeePercentage"), "PackagingFeePercentage")
)
.SetResultTransformer(Transformers.AliasToBean(typeof(Project)))
.Add(Restrictions.Eq("pkProjectID", pkProjectID))
.UniqueResult<Project>();
return proj;
}
return null;
}
Я попытался с помощью Projections.Property("ProjectUses")
и Projections.GroupProperty("ProjectUses")
для получения населенного подкласса, но без успеха.
И ниже является [упрощенный] код для класса и отображения определений
// Project class
public partial class Project
{
public int pkProjectID { get; set; }
public decimal ReservePercentage { get; set; }
public decimal FundingFeePercentage { get; set; }
public decimal PackagingFeePercentage { get; set; }
public ProjectUses ProjectUses { get; set; }
}
// ProjectUses class
public partial class ProjectUses
{
public int pkProjectID { get; set; }
public Project Project { get; set; }
...
}
// Project mapping
public class ProjectMap : ClassMap<Project>
{
public ProjectMap()
{
Table(@"Project");
LazyLoad();
Id(x => x.pkProjectID)
.Column("pkProjectID")
.Not.Nullable()
.GeneratedBy.Identity();
...
HasOne<ProjectUses>(x => x.ProjectUses)
.PropertyRef(r => r.Project)
.Cascade.All();
}
}
// Project Uses mapping
public class ProjectUsesMap : ClassMap<ProjectUses>
{
public ProjectUsesMap()
{
Table(@"ProjectUses");
LazyLoad();
Id(x => x.pkProjectID, "pkProjectID").GeneratedBy.Foreign("Project");
HasOne<Project>(x => x.Project)
.Constrained()
.ForeignKey()
.Cascade.None();
...
}
}
Я закончил с этим методом. Было немного сложно получить некоторые из отображений для работы, чтобы предотвратить получение ошибки «Больше одной строки с заданным идентификатором для класса». Как вы сказали, создание нового объекта домена позволило мне получить всю подобную информацию (из нескольких таблиц) в одно место, так что теперь все, что связано с цифрами или деньгами, инкапсулируется в свой класс. – Brett