2010-06-03 8 views
8

Es scheint, dass NHibernate ein ID-Tag als Teil des Mappings angegeben haben muss. Dies stellt für Ansichten ein Problem dar, da eine Ansicht nach meiner Erfahrung meistens keine ID hat. Ich habe Ansichten vorher in Nhibernate kartiert, aber so wie ich es gemacht habe, schien es mir unordentlich zu sein.Strategien zum Zuordnen von Ansichten in NHibernate

Hier ist ein erfunden Beispiel dafür, wie ich es gerade mache.

Mapping

<class name="ProductView" table="viewProduct" mutable="false" > 
    <id name="Id" type="Guid" > 
     <generator class="guid.comb" /> 
    </id> 
    <property name="Name" /> 
<!-- more properties --> 
    </class> 

Ansicht SQL

Select NewID() as Id, ProductName as Name, --More columns 
From Product 

Klasse

public class ProductView 
{ 
    public virtual Id {get; set;} 
    public virtual Name {get; set;} 
} 

ich für die p eine Id nicht brauchen Produkt oder im Falle einiger Ansichten habe ich möglicherweise keine ID für die Ansicht, je nachdem, ob ich die Kontrolle über die Ansicht habe

Gibt es eine bessere Möglichkeit, Ansichten auf Objekte in Nhibernate abzubilden?

bearbeiten
Antwort So Far

Mapping

<class name="ProductView" table="viewProduct" mutable="false" > 
    <id name="Id" type="Guid" /> 
    <property name="Name" /> 
    <!-- more properties --> 
    </class> 

Klasse

public class ProductView 
    { 
     public virtual Name {get; set;} 
     //more properties 
    } 

SQL anzeigen
Benötige ich noch NewID()?

Select NewID() as Id, ProductName as Name, --More columns 
From Product 

Antwort

5

Sie können es machen nur ein wenig sauberer, indem nicht die Abbildung der Id auf eine Eigenschaft und Weglassen des Generators:

<id column="Id" type="guid"/> 

Auf diese Weise halten Sie das Problem in der Datenschicht, ohne die Umsetzung Detail undichte zu deiner Domain.

+0

bedeutet das, dass ich die NewID() aus der TSQL-Auswahl entfernen kann, da sie nur dazu da ist, nhibernates Bedarf an einer ID zu erfüllen –

+2

Nein, das bedeutet, dass Ihre Klasse keine Id-Eigenschaft benötigt. –

+0

Ben hat Recht. NHibernate benötigt nicht, dass die ID einer Eigenschaft zugeordnet wird, aber sie muss immer eine Möglichkeit haben, persistente Instanzen zu identifizieren. –

2

Soweit ich weiß, wird NHibernate erfordern entweder eine ID oder eine composite-id Definition, da es der Mechanismus ist, durch die sie einen bestimmten Datensatz eindeutig identifiziert. Wenn es keine Kombination von Spalten gibt, die einen Schlüssel für jede Zeile in der Ansicht bereitstellt, denke ich, dass Sie mit hacky Problemumgehungen stecken.

+2

Ich wünsche, dass, wenn Sie eine Klasse als "veränderbar = falsch" markieren, dass die explizite Notwendigkeit für eine ID weggeht. Ich bin mir nicht sicher, ob das praktisch ist, würde aber Szenarien wie diese einfacher machen, imo. –

Verwandte Themen