2009-05-27 37 views
1

我有一个类“实验室”,它代表了一个使用我的程序的公司部门。它有一个名为“员工”的子集,旨在包含属于该实验室的所有员工。 employee表中包含一个名为“Department”的字符串字段,它代表了他们属于哪个部门,Lab表中包含一个名为“Department”的字符串字段,表示实验室是哪个部门。员工部门与实验室部门相匹配时,员工属于实验室。NHibernate与字符串映射,没有真正的外键

我意识到雇员表中包含一个LabID字段将是更好的方法,但员工表不在我的控制之下,我不想修改它。我宁愿在不添加员工到实验室的映射表的情况下这样做,因为针对部门的部门提供了相同的结果。

这是我试图使用的缩略映射。

<class name="Lab"> 
    <id name="LabID"> 
     <generator class="native" /> 
    </id> 
    <property name="Department" /> 
    <!--- other properties ---> 
    <set name="Employees" table="Employee_copy" generic="true" inverse="true"> 
     <key column="Department" property-ref="Department" />  
     <one-to-many class="Employee" /> 
    </set> 
    </class> 

返回该错误是

Identifier type mismatch; Found:<System.Int32> Expected:<System.String> Parameter name: identifier 

生成的查询运行正常。

SELECT employees0_.Department as Department1_, employees0_.EmployeeID as EmployeeID1_, employees0_.EmployeeID as EmployeeID30_0_, employees0_.CommonName as CommonName30_0_, employees0_.LastName as LastName30_0_, employees0_.NetUserID as NetUserID30_0_, employees0_.CompanyID as CompanyID30_0_, employees0_.Department as Department30_0_ FROM Employee employees0_ WHERE employees0_.Department='IS' 

所以我做错了什么?

编辑:

请注意反向关联正常工作。

<many-to-one name="Lab" column="Department" property-ref="Department" class="Lab" /> 

两个对象 - 实验室的相关属性:

public virtual int LabID { get; set; } 
public virtual string Department { get; set; } 
public virtual ISet<Employee> Employees { get; set; } 

员工:

public virtual int EmployeeID { get; protected set; }  
public virtual string Department { get; protected set; } 
public virtual Lab Lab { get; protected set; } 

回答

0

由于Employee表意为不可变的,我结束了创建一个视图,根据部门获得实验室ID,并直接链接到该实验室,而不是员工表。

呃。作品。