2009-08-25 13 views
2

Ich habe eine Legacy-Tabelle mit zusammengesetzten Schlüsseln, die auf 3 andere Tabellen zugeordnet sind, da diese Tabelle andere Attribute enthalten, da es keine einfache Zuordnungstabelle ist, kann ich die vielen nicht verwenden -to-many-Lösung zum Abbilden. nHibernate Composite-Schlüssel Klassentyp Mismatch

Das folgende ist das, was ich getan habe:

<class name="classA" table="A"> 
<composite-id name="ID" class="AKey"> 
    <key-many-to-one name="Id_one" class="One" column="Id_one" /> 
    <key-many-to-one name="Id_two" class="Two" column="Id_two" /> 
    <key-many-to-one name="Id_three" class="Three" column="Id_three" /> 
</composite-id> 

AKey ist lediglich eine Struktur, die die drei IDs hält, und Id_one, Id_two und Id_three sind alle als int in ihrer jeweiligen Klasse definiert.

public struct Akey { 
    public int Id_one { get; set; } 
    public int Id_two { get; set; } 
    public int Id_three { get; set; } 
} 

Dies kompiliert gut, aber wenn ich versuche, es zu laufen, es gibt mir eine Fehlermeldung:

NHibernate.QueryException: Typenkonflikt in NHibernate.Criterion.SimpleExpression: ID erwarteten Typ AKey, tatsächlicher Typ System.Int32

Bitte geben Sie an, was ich falsch oder falsch gemacht habe.

Vielen Dank!

Antwort

5

Wenn Sie vorhaben, Schlüssel-many-to-one verwenden würden Sie die Klasse setzen:

public class Akey { 
    public virtual One One {get; set;} 
    public virtual Two Two {get; set;} 
    public virtual Three Three {get; set;} 
} 

Andernfalls, wenn Sie die Id wollen, dass sie nur als Eigenschaften classA Karte:

<composite-id> 
    <key-property name="Id_one" column="Id_one" /> 
    <key-property name="Id_two" column="Id_two" /> 
    <key-property name="Id_three" column="Id_three" /> 
</composite-id> 

.

public class classA { 
    public virtual int Id_one {get; set;} 
    public virtual int Id_two {get; set;} 
    public virtual int Id_three {get; set;} 

    // ... rest of props ... 
} 

oder als Verbund wie Sie haben:

<composite-id name="ID" class="AKey"> 
    <key-property name="Id_one" column="Id_one" /> 
    <key-property name="Id_two" column="Id_two" /> 
    <key-property name="Id_three" column="Id_three" /> 
</composite-id> 

.

public class AKey { 
    public virtual int Id_one {get; set;} 
    public virtual int Id_two {get; set;} 
    public virtual int Id_three {get; set;} 
} 

public class classA { 
    public virtual AKey ID {get; set;} 

    // ... rest of props ... 
} 

Endlich ...

<composite-id> 
    <key-many-to-one name="Id_one" class="One" column="Id_one" /> 
    <key-many-to-one name="Id_two" class="Two" column="Id_two" /> 
    <key-many-to-one name="Id_three" class="Three" column="Id_three" /> 
</composite-id> 

.

Gehen zu stochern, ob Sie eine Struktur verwenden können, weil ich nicht kompetent auf sie in C# bin.

+0

Danke für Ihre Antwort! Der letzte Teil hat mir geholfen, mein Problem zu lösen, jetzt kann ich endlich weiter machen! = P – Akey

+0

Yah ... Ich erkannte, nachdem ich es geschrieben hatte, dass der letzte der erste sein sollte! – anonymous