2012-03-13 23 views
5

Pracuję z bazą danych brownfield, która używa ciągów jako kluczy podstawowych. Używanie Fluent NHibernate z Sqlite (dostawca w pamięci do testów jednostkowych) i SQL Server 2005.Jak używać klawiszy ciągów w (płynnym) NHibernate

Mam następujące jednostki:

public class Entity 
{ 
    public virtual DateTime TimeStamp { get; set; } 

    public virtual string Name { get; set; } 
} 

Z tego odwzorowania:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Map(_ => _.TimeStamp); 
     Id(_ => _.Name).CustomType("AnsiString"); 
    } 
} 

Jednak to nie działa, mówiąc NHibernate.TypeMismatchException : Provided id of the wrong type. Expected: System.Int32, got System.String

Jak dokonać tej pracy? Czy jest dostępna jakaś dobra dokumentacja dotycząca płynnego nhibernate?

Z góry dziękuję.

+0

thx za linki, choć nie są nowe dla mnie, ani zawierać niczego związanego moje pytanie :) I nie był w stanie znaleźć niczego na temat kluczy smyczkowych tam. Chciałbym również zacząć od jawnego mapowania. –

+0

Jest to omówione w tym linku http://stackoverflow.com/questions/411825/nhibernate-with-string-primary-key-and-relationships –

+0

@krystanhonour nie dokładnie. Również to pytanie nie ma akceptowanej odpowiedzi. Jeśli potrafisz rozpoznać odpowiedź, czy możesz ją tutaj odesłać i uzyskać głosowanie i moje uznanie? Dzięki. –

Odpowiedz

12

Jeśli używasz ciągi jako podstawowy kluczy prawdopodobnie będziesz musiał zrobić coś takiego:

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     Id(x => x.Name).GeneratedBy.Assigned(); 
     Map(x => x.TimeStamp); 
    } 
} 

Z NHibernate dokumentacji:

5.1.4.7. Przypisane identyfikatory

Jeśli chcesz, aby aplikacja przypisywała identyfikatory (w przeciwieństwie do po wygenerowaniu ich przez NHibernate), możesz użyć przypisanego generatora. Ten specjalny generator użyje wartości identyfikatora już przypisanej do właściwości identyfikatora obiektu. Zachowaj szczególną ostrożność podczas korzystania z tej funkcji, aby przypisać klucze o znaczeniu biznesowym (prawie zawsze jest to straszna decyzja projektowa ).

Ze względu na nieodłączny charakter, podmioty korzystające z tego generatora nie mogą być zapisane jako za pomocą metody SaveOrUpdate() ISession. Zamiast tego musisz jednoznacznie określić NHibernate, jeśli obiekt powinien zostać zapisany lub zaktualizować , wywołując metodę Save() lub Update() dla ISession z .

Poniżej znajduje się powiązany artykuł. To jest trochę przestarzały, ale nadal ma zastosowanie do sytuacji:

http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/6c9620b7c5bb7ca8

Powiązane problemy