2009-07-20 7 views
12

Czy możliwe jest posiadanie właściwości całkowitej klasy auto increment zarządzanej przez bazę danych, ale nie może to być klucz podstawowy (lub Id jak NHibernate odnosi się do nich)? Mam problem ze znalezieniem przykładów, jak to zrobić. Każda pomoc będzie doceniona. Dzięki.fluent nhibernate auto increment non key (Id) property

Odpowiedz

9

Dwie opcje.

  • jeśli baza danych jest w 100% odpowiedzialny za to po prostu trzeba powiedzieć NHibernate, że nieruchomość jest generowany i nie obejmuje go w żadnych nowości/isnerts. Minusem jest to, że NH będzie musiał dokonać dodatkowej selekcji, aby zachować świeżą wartość w pamięci.

    < nazwa property = "Foo" generowane = "always" update = "false" insert = "false" />

  • jeśli baza danych nie jest odpowiedzialny i chcesz po prostu mieć to zrobione automatycznie można użyj przechwytywacza, aby ustawić wartość 1 na wstawce i zwiększyć ją o 1 w aktualizacji.

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors (11,1 - Interceptors)

byłoby zastąpić OnSave(), aby znaleźć nieruchomość i ustawić wartość początkową, a następnie zastąpić OnFlushDirty(), aby znaleźć Nieruchomość i przyrost.


Edit:

jestem idiotą, nie zauważył pan powiedział Fluent NHibernate.


Edit # 2:

myślę, że może być również zainteresowany wykorzystaniem tej kolumny jako wersjami?

< version name="Foo" generated="always" /> 
+1

Nie martw się, to prawie to samo. Mapa (x => x.Foo) .ReadOnly().SetAttribute ("generated", "always"); Atrybut SetAttribute zostanie zastąpiony przez wartość Generate.Always, gdy osiągniemy wartość 1.0. –

+0

Pobrałem najnowszy FNH i byłem nieco zdezorientowany przez .Update() nie biorąc parametru. Nie byłem pewien, co to się skończy, jak w mapowaniu. ReadOnly() ma jednak sens. – anonymous

5

Działa to dla mnie:

public class Potato 
{ 
    public virtual Guid Id { get; protected set; } 
    public virtual int LegacyId { get; protected set; } 
} 

public class PotatoMap : ClassMap<Potato> 
{ 
    public PotatoMap() 
    { 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.LegacyId).CustomSqlType("INT IDENTITY(1,1)").Not.Nullable().ReadOnly().Generated.Insert(); 
    } 
} 

Zasadniczo całkowitą ma zostać wygenerowane przez bazę danych i NHibernate jest instruowany, aby pobrać go na wkładkach.

Należy pamiętać, że mapowanie stanowi tylko połowę odpowiedzi, a będzie działało , a nie, jeśli kolumna nie zostanie utworzona jako TOŻSAMOŚĆ. CustomSqlType jest dodawany do mapowania w celu utworzenia odpowiedniego sql podczas generowania tabel za pomocą SchemaExport. To jest generowane sql:

create table [Potato] (
     Id UNIQUEIDENTIFIER not null, 
     LegacyId INT IDENTITY(1,1) not null, 
     primary key (Id) 
    ) 

Z drugiej strony, tylko do odczytu i Generated.Insert() powie NHibernate, że wartość jest wygenerowany automatycznie przez bazę danych wyłącznie na wkładkach, a zatem ma do kwerendy bazy danych dla wartość przy każdej wstawce.

Zauważ, że testowałem to tylko z Sql Server. Typ niestandardowy prawdopodobnie zmieni się lub może nie być dostępny w innych bazach danych.