2010-02-10 17 views
13

Uso Fluent NHibernate y tengo dos tablas;Fluido NHibernate únete a una sola columna de otra tabla

cliente [ID, Nombre, LanguageID]

Idiomas [ID, Descripción]

Tengo una entidad de atención al cliente con las siguientes propiedades; ID, nombre, ID de idioma, idioma

Lo que me gustaría hacer es unirme a la tabla Idiomas para obtener la descripción del idioma y ponerlo en el idioma propiedad de la entidad del cliente.

He intentado utilizar Join pero no puedo conseguir que use el campo LanguageID en la tabla del cliente para unirme a la tabla Languages ​​- siempre quiere usar 'ID'.

Mi asignación parece;

 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"); 
     }); 
+0

https://stackoverflow.com/questions/1241005/how-to-join-table-in-fluent-nhibernate?rq=1 –

Respuesta

1

No he utilizado Ingreso antes, pero creo que desea que la clave externa de cliente de su asignación:

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"); 
    }); 

Editado para agregar: El mejor ejemplo que podría encontrar en el mapeo es unirse Ayende's blog. A partir de ese ejemplo, me parece que Join espera que el ID del objeto asignado sea una clave externa en la tabla unida. Su esquema tiene la ID de la tabla unida como FK en el objeto mapeado, por lo que no funcionará. Sugiero crear una vista que combine Customer and Language y mapear eso.

+0

No, eso no funciona - Intenta usar LanguageID en la tabla de idiomas, no clientes Necesito que sea al revés. – Matt

0

Creo que puede crear una Entidad para el idioma. Más adelante, en la Entidad para el Cliente, se hace referencia a esa Entidad.

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

Luego, en el CutomerMap que debe hacer:

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

Más tarde, cuando se llama a sus clientes que puede decidir el espectáculo "instance.Language.Description"

Por ejemplo, en MVC, en el controlador que puede hacer:

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

Y en la vista:

@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> 
} 

Espero que esto ayude.

Cuestiones relacionadas