2011-12-14 15 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();