webForumDet fria alternativet

NHibernate overridar satta guid-id

.NET

8 svar · 710 visningar · startad av cok

Medlem sedan dec. 2005664 inlägg
Frågan#1

Har följande klasser:

public class CircuitBreaker
{
    public CircuitBreaker()
    {
        ScheduleTasks = new List<ScheduleTask>();
    }
    
    public Guid Id { get; set; }
    public string Name { get; set; }
    public int? CircuitId { get; set; }
    public Breaker BreakerType { get; set; }
    public IList<ScheduleTask> ScheduleTasks { get; set; }
}

public class ScheduleTask
{
    public Guid Id { get; set; }
    public Guid CircuitBreakerId { get; set; }
    public string Name { get; set; }
    public int StartHour { get; set; }
    public int Startminutes { get; set; }
    public int DurationInHours { get; set; }
    public int DurationInMinutes { get; set; }
    
}

Mappningsfiler:

  
<class name="CircuitBreaker, Business" table="CircuitBreaker" lazy="false">

    <id name="Id" column="Id" type="guid" unsaved-value="00000000-0000-0000-0000-000000000000">
      <generator class="guid" />
    </id>

    <bag name="ScheduleTasks" inverse="true" lazy="false" cascade="all-delete-orphan">
      <key column="Id"/>
      <one-to-many class="ScheduleTask, Business"/>
    </bag>
    
    <property name="Name" column="Name" type="System.String" />
    <property name="CircuitId" column="CircuitId" type="System.Int32" />
    <property name="BreakerType" column="BreakerType" type="Breaker,Business"></property>

  </class>

  <class name="ScheduleTask, Business" table="ScheduleTask" lazy="false">

    <id name="Id" column="Id" type="guid" unsaved-value="00000000-0000-0000-0000-000000000000">
      <generator class="guid" />
    </id>

    <property name="Name" column="Name" type="System.String" />
    <property name="CircuitBreakerId" column="CircuitBreakerId" type="System.Guid" />
    <property name="StartHour" column="StartHour" type="System.Int32" />
    <property name="Startminutes" column="Startminutes" type="System.Int32" />
    <property name="DurationInHours" column="DurationInHours" type="System.Int32" />
    <property name="DurationInMinutes" column="DurationInMinutes" type="System.Int32" />

  </class>

När jag skapar upp följande:

CircuitBreaker cb = new CircuitBreaker();
cb.Id = Guid.NewGuid();
cb.Name = "testar";
cb.CircuitId = 999;
cb.BreakerType = Breaker.Schedule;

ScheduleTask task1 = new ScheduleTask();
//task1.Id = Guid.NewGuid();
task1.CircuitBreakerId = cb.Id;
task1.Name = "Mjuk";
task1.StartHour = 12;
task1.Startminutes = 0;
task1.DurationInHours = 2;
task1.DurationInMinutes = 22;

cb.ScheduleTasks.Add(task1);
CircuitBreakerService service = new CircuitBreakerService();
CircuitBreaker newCB = service.AddCircuitBreaker(cb);

Följande kodsnutt ovan skapar NHibernate själv upp nya id:n på nycklarna till respektive klass. Jag vill att om jag satt värden är det de som gäller och om jag inte satt några värden så ska NHibernate själv firra biffen. De borde ju gå att lösa, men jag kan inte förstå hur!?

Någon? :)

Medlem sedan aug. 20003 575 inlägg
#2

1. Varför vill du sätta ID:n i vissa fall själv och i andra inte?
2. Nej jag tror inte det går, eller ja det går men enbart för för olika objekt.
t.ex. har du ett objekt du alltid vill sätta ID på själv så sätter du generator class="assigned".
3. Du kan använda alternativ 2, och själv sätta ID:t om det inte finns något som du inte vill ha specialsatt med Guid.New();

Men frågan är fortfarande varför vill du sätta ID:t själv?
Oftast så går det att lösa på ett enklare och snyggare sätt.
t.ex. Task som du har där, istället för att säta ID:t

task1.CircuitBreakerId = cb.Id;

Gör följande:

task1.CircuitBreaker = cb;
Medlem sedan dec. 2005664 inlägg
#3

Om jag gör smo så då att jag sätter CiruitBreaker även på Task. Blir det något merjobb för nhibernate (sql anrop)?

Ska jag använda ngn slags many-to-one i mappningsfilen för Task?

Är det så man oftast jobbar med nhibernate att man låter nhibernate sätta id, och gör som du föreslår?

Medlem sedan dec. 19996 522 inlägg
#4

Ja Hibernate ska sätta ID:t åt dig, det är något som har med datalagringen att göra och inget som du ska hantera i exempelvis en DAO. Sen förstår jag inte varför du har CircuitBreakerId och inte en referens till ett CircuitBreaker-objekt i dina klasser, det är väll OO du skall göra och inte en representation av en data struktur :) Ja du kan använda en many-to-one i din Task-mappning för detta

SQL-anropen kan du kontrollera med hjälp av fetching strategies i antingen din mappningsfil eller dina querys. Anropen beror ju på om du använder lazy-load, hur du har implementerat din hibernate sessions hantering och hur du mappat upp dem med fetching.

Medlem sedan dec. 2005664 inlägg
#5

Varför jag använde id:t. Är för jag började testa nh, och pillade vidare..

Fungerar nu, får titta vidare på lazy-loading.

Tackar :bire

Medlem sedan dec. 19996 522 inlägg
#6

när du ändå är å rotar, kolla gärna på third och secon level cache :) Alltid bra att labba med ;)

Medlem sedan maj 20012 812 inlägg
#7

erka skrev:

Ja Hibernate ska sätta ID:t åt dig, det är något som har med datalagringen att göra och inget som du ska hantera i exempelvis en DAO.

Det finns tillfällen då man önskar sätta id:et själv eftersom du inte kan vänta på ditt DAL skall sätta det till dig. Jag har just det "problemet" själv nu när jag stoppar ner data till en kö och behöver använda id:et för att referera ihop det med data som kommer efteråt som också läggs på kön. Nu verkar det ju gå ändå, och det är tur eftersom behovet finns :)

- M

Medlem sedan dec. 19996 522 inlägg
#8

Undantagen som bekräftar regeln :) Visst finns det undantag, men rent generellt om vi snackar om identifierare så är jag av åsikten att det är något som hör till persistens och representerar en relationsdatabasstruktur i grund och botten. Misstolka mig rätt

Medlem sedan maj 20012 812 inlägg
#9

erka skrev:

Misstolka mig rätt

Jag misstolkar inte, bara utökar informationen lite.

Givetviss så har du rätt i att det inte bör skötas av programmeraren utan O/RMappern/DAL:et/Databasen. Ville bara påpeka att det finns tillfällen där man måste göra det själv, och därför så måste komponenterna klara av att hantera det.

- M

338 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
184 ms — deklarationer (db)
0 ms — hämta statistik (cache)
148 ms — hämta tråd, inlägg och bilagor (db)
183 ms — ändringar (db)