2013-03-25 2 views
0

У меня есть класс (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(); 

     ... 
    } 
} 

ответ

0

Вы можете сделать DTO со всеми необходимыми свойствами и проектировать с Project и ProjectUses на новый DTO. Это имеет дополнительное преимущество - отделить модель обзора от модели домена.

+0

Я закончил с этим методом. Было немного сложно получить некоторые из отображений для работы, чтобы предотвратить получение ошибки «Больше одной строки с заданным идентификатором для класса». Как вы сказали, создание нового объекта домена позволило мне получить всю подобную информацию (из нескольких таблиц) в одно место, так что теперь все, что связано с цифрами или деньгами, инкапсулируется в свой класс. – Brett

0

Вы пробовали с помощью .Not.LazyLoad() в вас ProjectMap класс?

+0

У меня есть. Это работает отлично, когда все, что я делаю, это вызов, например '_session.Get (_ID);', а nhibernate использует сопоставления для определения того, что нужно собирать, но поскольку я использую Projections для указания извлечения данных, все Lazy/NotLazy игнорируются (что имеет смысл). Спасибо, хотя – Brett

 Смежные вопросы

  • Нет связанных вопросов^_^