2013-03-27 62 views
0

經過無數個小時的嘗試讓Oracle Entity Framework與Oracle合作後,我放棄了並開始了NHibernate的發展。Oracle中的NHibernate關係

我正在爲這個行話苦苦掙扎,並且有一個問題。鑑於以下類,我如何使NHibernate(Fluent Mappings)輸出類似於下面的SQL的使用WriteOffApprovalUser.UserName作爲Employee.MailID字段的關鍵字。

C#類

public class WriteOffApprovalUser : EntityBase<WriteOffApprovalUser> 
{ 
    public virtual string UserName { get; set; } 
    public virtual Employee.Employee Employee { get; set; } 
} 

public class Employee : EntityBase<Employee> 
{ 
    public virtual string EmployeeID { get; set; } 
    public virtual string EmployeeStatusCode { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string PreferredName { get; set; } 
    public virtual string JobTitle { get; set; } 
    public virtual string Division { get; set; } 
    public virtual string Department { get; set; } 
    public virtual string Location { get; set; } 
    public virtual string City { get; set; } 
    public virtual string DeskLocation { get; set; } 
    public virtual string MailID { get; set; } 
    public virtual string Phone { get; set; } 
    public virtual string Fax { get; set; } 
    public virtual string SecCode { get; set; } 
    public virtual string SupervisorID { get; set; } 
} 

SQL

SELECT c.user_name, 
     a.LAST_NAME 
    || ', ' 
    || DECODE (a.PREFERRED_NAME, ' ', a.FIRST_NAME, a.preferred_name) 
     writeoff_approval_name 
FROM writeoff_approval_user c, adp_employee a 
WHERE c.USER_NAME = a.USER_ID AND c.exp_date IS NULL 
ORDER BY 2 

回答

1

在NHibernate中所有即將映射的正確方法。如果你使用流利的話,你應該在WriteOffApprovalUser中定義一個對Employee實體的引用。 Like in this basic tutorial

public class WriteOffApprovalUserMap : ClassMap<WriteOffApprovalUser> 
{ 
    public WriteOffApprovalUserMap() 
    { 
    Id(x => x.UserName); 
    References(x => x.Employee); 
    } 
} 

然後,所有你需要做的就是像

List<Employee> employees = session.Where(e => e.exp_date == null); 

一個簡單的查詢,我還沒有看到任何映射的日期,但我這個很容易解決。

然後要有DECODE功能,我會建議你做一些DDD,而不是簡單地爲Employee創建一個anemic class創建一個返回組合用戶名的屬性。

class Employee 
{ 
    public string ComposedName 
    { 
     get { 
      return this.LastName + string.IsNullOrEmpty(this.preferedName) ? 
      this.FirstName : this.PreferedName; 
     } 
    } 
} 

對我來說應該被視爲一種計算,並且不需要在SQL查詢中進行。作爲獎勵,此代碼可以進行單元測試。