webForumDet fria alternativet

nhibernate klass + top 1 relaterad klass

.NET

3 svar · 542 visningar · startad av doggelito

Medlem sedan juni 20003 076 inlägg
Frågan#1

Tjena,
Jag har en "huvudklass" som har en one-to-many relation till en "underklass".
Till detta skulle jag i mappningen kunna göra en bag i huvudklassen som håller alla underklasser och sedan för att hämta ett värde skriva:

ImprovementStatus status = Improvement.Statuses[0];

Inga konstigheter där!

Nu är det så att en bag, eller samling, är helt ointressant att hämta upp, varför underklassen kan innehålla flera rader är bara för att få en historik.
Det enda (i nuläget kan väl tilläggas) som är intressant är att hämta ut den senaste radern ur underklassen dvs. select max(Underklass).
Så, är det möjligt att skapa en property alt. annan typ av mappning som hämtar senaste underklassen för att slippa en bag?
Så att jag kan skriva:

ImprovementStatus status = Improvement.Status;

Typ nått sånt här:

<class name="Improvement, DomainObjects" table="Improvements">
    <id name="ID" column="ImprovementID" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>
    <property name="Status" formula="(select max(Status) )" />
</class>
<class name="ImprovementStatus, DomainObjects" table="ImprovementStatuses">
    <id name="ID" column="StatusID" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>
    <many-to-one name="Improvement" class="Improvement, DomainObjects" column="ImprovementID" fetch="join" />
    <property name="Status" column="Status" type="int"/>
  </class>

Eller:

<class name="Improvement, DomainObjects" table="Improvements">
    <id name="ID" column="ImprovementID" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>
    <many-to-one name="Status" class="ImprovementStatus, DomainObjects" formula="(select max(Status) )" />
</class>

<class name="ImprovementStatus, DomainObjects" table="ImprovementStatuses">
    <id name="ID" column="StatusID" type="int" unsaved-value="0">
      <generator class="identity" />
    </id>
    <many-to-one name="Improvement" class="Improvement, DomainObjects" column="ImprovementID" fetch="join" />
    <property name="Status" column="Status" type="int"/>
  </class>

Jga har testat olika varianter att köra en formula i many-to-one, jag får inget felmeddelande där men heller inte rätt värden.
Enligt dokumentationen är inte formula implementerat i many-to-one men den genererar inte fel så...?!

Medlem sedan aug. 20003 575 inlägg
#2

Måste du ha det i entiteten kan du inte ha en service som gör det åt dig?

Medlem sedan juni 20003 076 inlägg
#3

Jag måste inte ha den i entiteten men jag tycker dock att det är smidigt, även om det blir lite overload i selectsatserna att använda formulas i mappningarna! :)
Jag har sett andra som sätter formula, inte bara i property-fält, utan även i relationer, men det verkar vara för Hibernate och inte NHibernate. Det kanske är under utveckling med en portning?!

Medlem sedan jan. 20103 inlägg
#4

En annan, inte allt för snygg lösning, är att mappa din bag till en privat variabel och sedan ha en property som returnerar den första. Då döljer du iallafall listan för konsumenter av ditt API.

262 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)