Oracle中的NHibernate关系

时间:2013-03-27 22:17:31

标签: nhibernate fluent-nhibernate

在尝试让Entity Framework与Oracle协同工作数小时之后,我已经放弃并开始了NHibernate的路径。

我正在努力学习语言,并有一个问题。鉴于以下类,如何使用WriteOffApprovalUser.UserName作为Employee.MailID字段的键,使NHibernate(Fluent Mappings)输出类似于下面的SQL的内容。

C#Classes

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 个答案:

答案 0 :(得分: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查询中执行此操作。作为奖励,此代码可以进行单元测试。