2010-03-12 1 views
5

Ist es eine gute Idee, eine leichtere Version einer Entität in einigen Fällen nur aus Leistungsgründen zu erstellen, die auf dieselbe Tabelle verweist, aber weniger Spalten zugeordnet. Wenn z. B. eine Kontakttabelle mit 50 Spalten vorhanden ist und einige der zugehörigen Entitäten an der Eigenschaft FirstName und LastName interessiert sind, empfiehlt es sich, eine Lightweight-Version der Contact-Tabelle zu erstellen. Z.B.Verwenden der Lite-Version der Entität in nHibernate Relations?

public class ContactLite 
{ 
    public int Id {get; set;} 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 

} 

Ist es auch möglich, mehrere Klassen derselben Tabelle zuzuordnen?

Antwort

4

Es ist keine gute Idee. Ordnen Sie stattdessen immer die vollständige Klasse zu und erstellen Sie kleinere Klassen, die Sie projizieren können, indem Sie Transformers.AliasToBean oder LINQ verwenden.

Ein Beispiel des letzteren:

var lightContacts = (from contact in session.Linq<Contact>() 
        where contact.Country = "Argentina" 
        select new LightContact 
          { 
           Id = contact.Id 
           FirstName = contact.FirstName, 
           LastName = contact.LastName 
          }) 
        .ToList(); 

Dies wird nur diese drei Felder aus der DB wählen, auch wenn sie von einer anderen Filterung.

Es ist erwähnenswert, dass Sie mit LINQ auch einen anonymen Typ verwenden können, um eine beliebige Projektion auszuwählen, ohne zusätzliche Typen oder Zuordnungen zu erstellen.

+0

Ich möchte hauptsächlich für Beziehungen verwenden. Wenn ich eine Many-2-One-Beziehung habe, möchte ich nicht 50 Spalten laden. – Amitabh

+0

Immer noch der gleiche Fall. Standardmäßig werden Viele-zu-Einser als Proxys mit dem Primärschlüssel geladen, und sie werden überhaupt nicht geladen, wenn Sie sie wie oben ausschließen. –

+0

Leider bin ich auf nHibernate 1.2 mit WCF und Lazy Loading ist bei mir keine Option. So wird alles eifrig abgeholt. – Amitabh

5

Ordnen Sie mehrere Klassen nicht derselben Tabelle zu. Ich habe es einmal versucht und obwohl es für das, was ich getan habe, funktioniert hat, ich bin mir sicher, dass es mich später gebissen hätte. Es ist besser, Projektionen zu verwenden, um die "leichten" Klassen zu füllen.

1

Ich benutzte diesen Ansatz für die Handhabung einer Entity ohne BLOB-Feld (nur für die Handhabung von Beziehungen usw.).

ich hatte einige Probleme in Bezug auf Implicit Polymorphismus, was bedeutet, ich dieses Setup hatte:

public class ImageWithData: Bild

Die Erbschaft gemacht NHibernate eine ImageWithData in einer zweiten Umlauf jedes Mal lade ich ein Bild direkt gelöst (nicht im Zusammenhang mit BelongsTo oder HasMany).

Es gibt eine Option in NHibernate, um dieses Verhalten zu deaktivieren, genannt polymorphism = "explicit", das Sie in Ihrer Basisklasse angeben (in meinem Fall Image).

Wenn es in Ihrem Fall schlechtes Design ist, weiß ich nicht, es hängt alles davon ab, warum Sie Ihre Entitäten aufhellen müssen.