2009-05-27 9 views
1

J'ai une classe "Lab" qui représente un département d'une société qui utilise mon programme. Il a une collection enfant appelée "Employés" qui est destinée à contenir tous les employés qui appartiennent à ce laboratoire. La table des employés contient un champ de chaîne appelé "Département" qui représente le département auquel ils appartiennent, et la table Lab contient un champ de chaîne appelé "Département" qui représente quel département est le laboratoire. Un employé appartient à un laboratoire lorsque le département de l'employé correspond au département du laboratoire.NHibernate mappage avec des chaînes, pas de véritables clés étrangères

Je me rends compte que le fait d'avoir une table employee contient un champ LabID serait l'approche préférable, mais la table employee n'est pas sous mon contrôle et je ne veux pas la modifier. Je préférerais faire cela sans ajouter une table de correspondance d'un employé à un laboratoire, puisque le ministère contre département fournit le même résultat.

Ceci est le mappage abrégé que j'essaie d'utiliser.

<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> 

l'erreur renvoyée est

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

La requête générée fonctionne très bien.

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' 

alors qu'est-ce que je fais mal?

EDIT:

Notez également que l'association inverse fonctionne très bien.

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

Les propriétés associées pour les deux objets- Lab:

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

Employé:

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

Répondre

0

Depuis la table des employés devait être immuable, je fini par créer une vue qui a obtenu l'ID Lab basé sur le département, et un lien vers celui-ci au lieu de la table des employés directement.

Meh. Travaux.

Questions connexes