13 votes

Fluent NHibernate joint une seule colonne d'une autre table

J'utilise Fluent NHibernate et j'ai deux tables ;

Client [ID, Nom, LanguageID]

Langues [ID, Description]

J'ai une entité Client avec les propriétés suivantes ; ID, Nom, LangueID, Langue

Ce que je voudrais faire, c'est joindre la table Langues pour obtenir la description de la langue et la mettre dans la propriété langue de l'entité client.

J'ai essayé d'utiliser la jointure, mais je n'arrive pas à utiliser le champ LanguageID de la table customer pour faire la jointure avec la table Languages - il veut toujours utiliser 'ID'.

Ma cartographie se présente comme suit ;

        Table("Customers");
        Not.LazyLoad();
        Id(c => c.ID).GeneratedBy.Assigned();
        Map(c => c.Name);
        Map(c => c.LanguageID);
        Join("Languages", join =>
        {
            join.KeyColumn("ID");
            join.Map(prop => prop.Language).Column("Description");
        });

1voto

Jamie Ide Points 28680

Je n'ai pas utilisé Join auparavant mais je pense que vous voulez la clé étrangère de Customer dans votre mapping :

    Table("ScriptActivities");
    Not.LazyLoad();
    Id(c => c.ID).GeneratedBy.Assigned();
    Map(c => c.Name);
    Map(c => c.LanguageID);
    Join("Languages", join =>
    {
        join.KeyColumn("LanguageID");
        join.Map(prop => prop.Language).Column("Description");
    });

Modification de l'article : Le meilleur exemple que j'ai pu trouver sur la cartographie de la jointure est le suivant Le blog d'Ayende . D'après cet exemple, il me semble que la jointure s'attend à ce que l'ID de l'objet mappé soit une clé étrangère dans la table jointe. Dans votre schéma, l'ID de la table jointe est une clé étrangère dans l'objet mappé, de sorte que la jointure ne fonctionne pas. Je suggère de créer une vue combinant le client et la langue et de la mapper.

0voto

Daniel Silva Points 41

Je pense que vous pouvez créer une entité pour la langue. Plus tard, dans l'Entité pour le Client, il y a une référence à cette Entité.

public class Customer
{
    public virtual int Id { get; set; }
    public virtual string Name{ get; set; }
    public virtual Language Language { get; set; }
}

Ensuite, dans le CutomerMap, vous devez faire ce qui suit :

public class CustomerMap : ClassMap<Customer>
{
    public CustomerMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        References(x => x.Language);
    }
}

Plus tard, lorsque vous appellerez vos clients, vous pourrez décider d'afficher l'"instance.Language.Description"

Par exemple, en MVC, dans le contrôleur, vous pouvez faire :

 public ActionResult Index()
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            var customers = session.Query<Customer>().Fetch(x => x.Language).ToList();
            return View(customers);
        }
    }

Et dans le View :

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.Name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Language.Description)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.Id }) |
        @Html.ActionLink("Details", "Details", new { id=item.Id }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.Id })
    </td>
</tr>
}

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X