2009-06-15 12 views
9

Czy można wykonać mapowanie w NHibernate bez użycia identyfikatora?Mapowanie NHibernate bez identyfikatora

Co staram się zrobić to, wywołania procedury przechowywanej przy użyciu

session.CreateSqlQuery(myQuery).AddEntity(typeof(MyEntity)); 

Procedura jest agregatem i nie ma pola Id zwracane, ale nadal chciałby skorzystać z mapowania NHibernate dane zwrócone do jednostki. Jedyne, co do tej pory wymyśliłem, to wykonanie procedury dodania pola "O jak Id" lub czegoś podobnego i posiadanie przez podmiot fałszywego pola ID.

Odpowiedz

3

Znalazłem, że to naprawdę nie jest możliwe. Dane zwrócone z procedury składowanej muszą również mieć identyfikator. To działało, aby utworzyć kolumnę manekinową z identyfikatorem i sztuczną właściwością obiektu, ale zdecydowałem się przekonwertować dane zwrócone przez NHibernate na obiekt ręcznie.

Zasadniczo nie powinno się używać procedur przechowywanych z NHibernate. To jest ORM afterall. W moim przypadku nie miałem innego wyboru, jak skorzystać z procedury.

0

muszę dokładnie sprawdzić xsd, ale wierzę, że wymagane są albo id lub kompozytowych id. Jednak na dokumentach nazwa nie jest wymagana. Tak więc powinieneś być w stanie podać prawie pustą sekcję id.

W podobnej sytuacji ustawiłem klasę na mutable = "false" i zmapowałem identyfikator do indeksu wiersza i ustawiłem generator w odwzorowaniu id na przypisany.

+1

Okay - głupie pytanie. W jaki sposób mapuje się do indeksu wiersza? Jak to wygląda w pliku odwzorowania? Szukaliśmy tego w dokumentacji i postanowiliśmy zapytać. – ferventcoder

4

Twój byt musi być w jakiś sposób "unikalny", nawet jeśli nie ma pola Id.

zdecydować, które właściwości, razem wzięte, musi być unikalny i użyć klucza kompozytowego nad nimi ...

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 
0

Od @Andy McCluggage poście:

można bardzo dużo zrobić w mapowanie:

<composite-id> 
    <key-property name="Property1" column="Column1"/> 
    <key-property name="Property2" column="Column2"/> 
</composite-id> 

Ale trzeba zastąpić equals() i GetHashCode() w modelu

public class MyClass 
{ 
    public virtual DateTime Property1; 
    public virtual string Property2; 
    public virtual int SomeOtherProperty; 

    public override bool Equals(object obj) 
    { 
     if(obj == null) 
      return false; 

     var t = obj as MyClass; 

     if(t == null) 
      return false; 

     if (this.Property1 == t.Property1 && this.Property2 == t.Property2) 
      return true; 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return (this.Property1 + "|" + this.Property2).GetHashCode(); 
    } 
} 
Powiązane problemy