2010-04-08 4 views
0

Je pense que c'est une question modérément néophyte. J'utilise NHibernate/FluentNHibernate depuis environ 6 mois, et je pense avoir une bonne compréhension des bases. Maintenant, je pousse un peu plus loin. Je suis sûr que cela est documenté, mais j'ai passé plusieurs heures maintenant sur Google, et je n'ai pas encore tout compris.NHibernate Fluent tables jointes un-à-un

J'ai classe simple, appelez simple:

public class Simple 
{ public string Name { get; set;} 
    public string Desc { get; set; } 
    public string Status { get; set;} 
} 

Etat est en fait contraint d'être l'un d'un petit ensemble de valeurs: « ACTIVE », « en attente » et « FERME ». Dans le schéma DB, j'ai une simple table de lecture seule appelé RetrofitStatus:

CREATE TABLE [dbo].[RetrofitStatus](
[Status] [nvarchar](10) NOT NULL, 
[SortOrder] [smallint] NOT NULL, 
CONSTRAINT [PK_RetrofitStatus] PRIMARY KEY CLUSTERED 
(
    [Status] ASC 
) 

Et il y a une contrainte de clé étrangère sur la table simple pour vous assurer que l'état est en RetrofitStatus.

Le but de la table RetrofitStatus est d'inclure la colonne SortOrder afin que je puisse faire (dans SQL)

SELECT * from Simple s join RetrofitStatus r on r.Status=s.Status ORDER BY r.SortOrder 

et trier mes résultats dans un ordre d'affichage (par exemple, toutes les entrées ACTIVE, puis ON -HOLD entrées, puis entrées FERMÉ, puisque je suis trier sur un ordre logique, pas alphabétique ou toute autre chose facilement reconnaître). Ma question est, comment puis-je modéliser cet objet et cette relation dans FNH? Je peux ajouter la propriété SortOrder à ma définition simple et créer une vue qui représente cela, mais que se passe-t-il lorsque j'essaie d'insérer de nouveaux objets simples dans la table? Évidemment, je ne veux pas essayer d'insérer la propriété SortOrder. Je pense que je dois utiliser l'élément NHib d'une façon ou d'une autre, mais encore une fois, je ne sais pas où cela doit aller, ce qui se passe sur l'insert, et comment le faire dans Fluent? Je vais essayer d'expérimenter avec des essais et erreurs, mais je pensais que peut-être quelqu'un qui sait ce qu'ils font (ce que je ne fais pas) peut me diriger dans la bonne direction et me sauver un peu de temps . Merci de votre aide.

Répondre

1

En supposant que vous aviez une classe Simple modifiée comme suit (je ne savais pas ce que vous faisiez sur une clé):

public class Simple 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Desc { get; set; } 
    public string Status { get; set; 
    public int SortOrder { get; set; } 
} 

vous pouvez mapper comme ceci:

public SimpleMap : ClassMap<Simple> 
{ 
    Id(x => x.Id).Unique().GeneratedBy.Native(); 
    Map(x => x.Name); 
    Map(x => x.Desc); 
    Join("RetrofitStatus", join => 
    { 
     join.KeyColumn("Status") 
      .Map(x => x.Status); 
     join.Map(x => x.SortOrder).Not.Insert(); 
    }); 
} 

refuge I T testé cela, mais c'est l'essentiel de celui-ci.

Vous pouvez spécifier qu'une propriété ne peut pas être inséré ou mis à jour à l'aide Not.Insert() ou Not.Update(), respectivement dans votre correspondance, ou ne peut être ni inséré ni mis à jour à l'aide ReadOnly().