2013-03-27 4 views
0

После бесчисленных часов попыток заставить Entity Framework работать с Oracle, я отказался и пошел по пути NHibernate.NHibernate Отношения в Oracle

Я немного борюсь с жаргоном и задаюсь вопросом. Учитывая следующие классы, как мне сделать 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, вместо того, чтобы просто делать anemic class для Employee, создать свойство, которое возвращает сгенерированное имя пользователя.

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

Для меня это нужно рассматривать как расчет, и нет необходимости делать это в SQL-запросе. В качестве бонуса этот код может быть Unit Unit.