2011-12-14 19 views
0

我有一個實體類,它有3列; entityType,entityID和EntityText。例如:如果實體類型爲3(contact),entityID爲2,它將加入到Contacts表中,並通過entityID獲取聯繫人,並將contact.name屬性設置爲EntityText。我怎樣才能做到這一點?使用NHibernate從多個條件表中選擇列

詳情: 不同的對象類。

Contact 
{ 
contactID 
firstName 
lastName 
.. 
} 
Company 
{ 
companyID 
name 
address 
... 
} 
Task{ 
taskID 
entityID 
entityType 
entityText= Company.name or Contact.firstName + Contact.lastName 
... 
} 
+0

你的問題有點不清楚。所有這些映射是否都是相同的對象類?你可以添加你的班級代碼嗎? – 2011-12-14 08:22:58

+0

不同的對象類,它們是不同的。我已經添加了它。 – iboware 2011-12-14 12:18:00

回答

0

編輯:重構相匹配的更新問題

因爲EntityText的內容背後的邏輯,我會prefere多態性

public abstract class Task 
{ 
    public virtual int Id { get; set; } 
    public abstract string Text { get; set; } 
} 

public class ContactTask : Task 
{ 
    public virtual Contact Contact { get; set; } 
    public override string Text 
    { 
     get { return Contact.FirstName + " " + Contact.LastName; } 
     set { Contact.FirstName = value.Split(' ')[0]; Contact.LastName = value.Split(' ')[1]; } 
    } 
} 
public class CompanyTask : Task 
{ 
    public virtual Company Company { get; set; } 
    public override string Text 
    { 
     get { return Company.Name; } 
     set { Company.Name = value; } 
    } 
} 

public class TaskMap : ClassMap<Task> 
{ 
    public TaskMap() 
    { 
     Table("TaskTable"); 

     Id(c => c.Id, "taskID").GeneratedBy....(); 
     DiscriminateSubclassesOn("entityType"); 
    } 
} 

public class ContactTaskMap : ClassMap<ContactTask> 
{ 
    public ContactTaskMap() 
    { 
     DiscriminatorValue(3); 
     References(ct => ct.Contact, "entityID"); 
    } 
} 

public class CompanyTaskMap : ClassMap<CompanyTask> 
{ 
    public ContactTaskMap() 
    { 
     DiscriminatorValue(2); 
     References(ct => ct.Company, "entityID"); 
    } 
} 

// get all tasks 
var all = session.QueryOver<Task>().List(); 

// get all tasks for Company 
var companyTasks = session.QueryOver<CompanyTask>().List();