2010-09-16 7 views
8

estoy usando NHibernate Fluido y tengo dos tablas:Únete a una tabla con dos columnas no FK con Fluido NHibernate

BusinessPlan [Id, Year, CustomerCode] 

PreviousYearData [Id, Year, CustomerCode, MoreFieldsForData] 

En mi dominio, quiero unirme a la PreviousYearData Businessplan para que las entidades algo como esto:

public class BusinessPlan { 
    public Guid Id { get; set; } 
    public int Year { get; set; } 
    public string CustomerCode { get; set; } 
    public PreviousYearData PreviousYearData {get; set;} 
} 

public class PreviousYearData { 
    public Guid Id { get; set; } 
    public int Year { get; set; } 
    public string CustomerCode { get; set; } 
    // many more fields 
} 

los datos de la tabla PreviousYearData se rellena previamente al comienzo del año antes se habrán creado los BusinessPlans, por lo que no se sabe cuál será el identificador del Plan de negocio y no puede crear una clave externa normal. Lo que creo que quiero hacer es unirme al PreviousYearData to BusinessPlan basado en las dos columnas Year y CustomerCode. ¿Es esto posible con Fluiber NHibernate? ¿Hay alguna otra forma de abordar esto que tenga más sentido?

Respuesta

1

supongo que esto o algo similar debería funcionar para usted:

 HasMany(x => x.PreviousYearDatas) 
      .Access.AsCamelCaseField(Prefix.Underscore) 
      .WithKeyColumns("YEAR", "CUSTOMER_CODE") 
      .LazyLoad(); 

Tendrá colección, pero usted será capaz de conseguir lo que quiere.

También hay otra construcción:

 HasMany( 
      // some mapping but includes one foreign key - say customer code 
      .Where("YEAR = 2010") 

Probablemente es la mejor opción. No creo que los años están cambiando a menudo :)

0

no veo por qué hay un problema con tener una clave externa en la tabla Businessplan: PreviousYearDataId

en Businessplan mapeo sólo tiene que añadir:

References(x => x.PreviousYearData) 
    .Column("PreviousYearDataId") 
+0

Sí. Si la tabla PreviousYearData está poblada primero, ¿por qué la tabla BusinessPlan no tendría el ID de su registro PreviousYearData correspondiente? – David

Cuestiones relacionadas