2009-11-19 12 views
5

Ho già utilizzato L2S e sto cercando di utilizzare NHib insieme a Sharp Architecture su un progetto. Ho iniziato la prototipazione e mi sono imbattuto nel primo problema che non ho idea di come fare per Google.NHBernate POCO/Nozioni di base

Dato un POCO con alcune proprietà semplici, e una proprietà di riferimento (Categoria - classe non mostrato qui):

public class Post 
{ 
    public Post() 
    { 
    this.DateCreated = DateTime.Now; 
    } 

    public virtual string Title {get;set;} 
    public virtual DateCreated {get;set;} 
    public virtual Category {get;set;} 
} 

Questo è utile se voglio dire produrre una sintesi di tutti i messaggi in formato tabellare - se Voglio una colonna di nome "Categoria" e voglio mostrare il titolo della categoria posso semplicemente usare Post.Category.Title.

Tuttavia un utente crea un nuovo post (seleziona una categoria da un elenco a discesa o simile). Fanno clic su Invia e creo un oggetto Post. Tuttavia, prima che possa persistere nel nuovo post, devo recuperare un'istanza della categoria (da id) da assegnare alla proprietà Category?

Come ottenere il meglio da entrambi i mondi? Se aggiorno Post POCO, rendendo la categoria un int, ho reso più semplice la creazione di nuove istanze. Ma più difficile per qualche codice di rendering che ora dovrà risolvere il nome della categoria dato l'Id?

Mi sembra che manchi un concetto di base qui?

So che con Linq a Sql, dato uno schema in cui la tabella Post aveva una colonna chiave per campi interi denominata CategoryId, generava sia la colonna della tabella sottostante (CategoryId) che EntitySet che conteneva la riga di chiave esterna.

Come acheive simili in NHibernate? Come è generalmente gestito?

Grazie

risposta

4

Le entità associate devono essere mappate come entità - ad es. Category, non int CategoryId.

Quando si crea un nuovo Post, se non si dispone di un'istanza effettiva Category (e perché no? Se si selezionano le categorie da un elenco che le hai già caricate) ma solo il proprio id è può usare un metodo Load() per ottenere un'istanza Categoria persistente dato id senza in realtà colpire un database:

post.Category = (Category) sesssion.Load(typeof(Category), categoryId); 

È inoltre possibile utilizzare la versione generica:

post.Category = session.Load<Category>(categoryId); 
+0

@Justice - grazie per la modifica – ChssPly76

+0

Grazie per la risposta. Questo scenario è web (asp.net mvc) e sto cercando di evitare troppe ricerche sul Db sul postback * solo * per ripopolare essenzialmente la ricerca oi dati referenziali al fine di mantenere un'entità che potrebbe avere molti associati entità. Il metodo di caricamento sembra ottimo (e avrei dovuto pensarci, ma come novellino ho bisogno di familiarizzare con NHib - il libro sta arrivando). – 6footunder

1

In NHibernate, si utilizzerà una proprietà di riferimento.

Utilizzando la mappatura fluente, sembra qualcosa di simile:

mapping.References(x => x.Category, "CategoryId").PropertyRef(x=>x.Id).Cascade.All(); 

in XML, è grosso modo

<many-to-one name="Category" column="category_id" class="YourNamespace.Category" cascade="all" property-ref="Id" /> 

È possibile utilizzare non ritrovata a raccogliere il comportamento quando non c'è categoria associata.

In sostanza, si desidera la semantica dell'oggetto categoria, non l'ID, quindi è sufficiente comunicare a NHibernate in che modo sono associati.

+0

Sry, scusa la mia lentezza ... il PropertyRef ha l'effetto? Ho appena cercato su google e nient'altro che proprietà fluide non draga su ciò che sembra utile :-) – 6footunder

+0

In questo caso, fa riferimento alla proprietà Id dell'oggetto Category, collegandola alla colonna CategoryId in Post. (Probabilmente avrei dovuto usare category_id per essere coerente con il mio esempio di mappatura xml). – JasonTrue