2010-05-28 8 views
3

Nous utilisons FluentNHibernate et nous avons rencontré un problème où notre modèle d'objet nécessite des données de deux tables comme ceci:FluentNHibernate, obtenir une colonne d'une autre table

public class MyModel 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int FooId { get; set; } 
    public virtual string FooName { get; set; } 
} 

Là où il y a une table de MyModel qui a Id, Name et FooId en tant que clé étrangère dans la table Foo. Les tables Foo contient Id et FooName.

Ce problème est très similaire à un autre article ici: Nhibernate: join tables and get single column from other table mais j'essaie de comprendre comment le faire avec FluentNHibernate.

Je peux créer facilement l'ID, le nom et le FooId ... mais ma correspondance avec FooName me pose problème. Ceci est ma carte de classe:

public class MyModelClassMap : ClassMap<MyModel> 
{ 
    public MyModelClassMap() 
    { 
     this.Id(a => a.Id).Column("AccountId").GeneratedBy.Identity(); 
     this.Map(a => a.Name); 
     this.Map(a => a.FooId); 

     // my attempt to map FooName but it doesn't work 
     this.Join("Foo", join => join.KeyColumn("FooId").Map(a => a.FooName)); 
    } 
} 

avec cette cartographie je reçois cette erreur:

L'élément « classe » dans l'espace de noms « urn: NHibernate-mapping-2.2 » a un élément enfant invalide « rejoindre » dans l'espace de noms 'urn: nhibernate-mapping-2.2'. Liste des éléments attendus: 'jointed-subclass, loader, sql-insert, sql-update, sql-delete, filtre, resultset, query, sql-query' dans l'espace de noms 'urn: nhibernate-mapping-2.2'.

des idées?

Répondre

0

Je pense que vous avez mal compris quelque chose ici.

Au lieu d'avoir Id, Nom, fooid et FooName dans la même classe, vous devez créer deux classes

public class MyModel 
{ 
    public virtual int Id { get; set; } 

    public virtual string Name { get; set; } 

    public virtual Foo Foo { get; set; } 
} 

public class Foo 
{ 
    public virtual int Id { get; set; } 

    public virtual string FooName { get; set; } 
} 

Et vos cours de cartographie pour ces:

public class MyModelMapping : ClassMap<MyModel> 
{ 
    public MyModelMapping() 
    { 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     this.References(x => x.Foo); 
    } 
} 

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     this.Id(x => x.Id); 
     this.Map(x => x.FooName); 
    } 
} 

cela devrait aider.

Mais rappelez-vous Convention autre configuration :)

+0

Ouais voilà comment je traditionnellement le faire, parce que, en substance, est ce qui devrait être modélisé (d'autant plus que la DB est configuré de cette manière) Cependant, mon exigence (qui vient de ci-dessus) ne veut pas le faire de cette façon .... Aussi, c'est une simplification du problème réel pour le bien de la discussion. Le problème REAL est que si nous l'avons fait comme vous l'avez suggéré, la classe Foo aurait une propriété de type Foo2, et la classe Bar aurait une propriété de type Foo2 ... etc etc Cela signifie avoir un tas de choses inutiles rejoint/sous-sélectionne quand tout ce dont j'avais besoin était cette propriété ... – puffpio

Questions connexes