2013-03-25 43 views
0

我有一個類(項目),代表一個有點大的數據庫表。除了一個子類(ProjectUses,它代表與Project有1:1關係的另一個DB表)之外,我只需要檢索大約十幾列。我能夠使用如下所示的投影來很好地獲取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,並將其從ProjectProjectUses投影到新的DTO上。這具有將視圖模型與領域模型分開的附加優點。

+0

我結束了這個方法。這是一個棘手的問題,讓一些映射工作以防止出現「給定類標識符的多行」錯誤。就像你說的那樣,創建一個新的域對象允許我將所有類似的信息(來自多個表)集中到一個地方,所以現在任何與數字或金錢有關的事情都被封裝在自己的類中。 – Brett 2013-04-16 15:09:08

0

[簡化]代碼,你是否嘗試過使用.Not.LazyLoad()你ProjectMap類?

+0

我有。當我所做的只是一個調用,例如'_session.Get (_ID);',並且nhibernate使用映射來確定要採集的內容時,它正常工作,但由於我使用Projections來指定數據檢索,所有Lazy/NotLazy被忽略(這是有道理的)。謝謝,雖然 – Brett 2013-03-25 20:41:21