2009-01-15 18 views
38

Soy nuevo en NHibernate con fluidez. Ahora me enfrento a un problema con la asignación de claves compuestas. ¿Alguien puede indicar la URL o la muestra, por favor?Asignación de claves compuestas en Fluido NHibernate

+0

encontraste ejemplo más detallado aquí http://devlicio.us/blogs/derik_whittaker/archive/2009/01/16/using-fluentnhibernate-to-map-composite-keys-for-a-table .aspx –

Respuesta

48

Hay un método CompositeId.

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     CompositeId() 
     .KeyProperty(x => x.Something) 
     .KeyReference(x => x.SomethingElse); 
    } 
} 
+17

Tenga en cuenta que en las nuevas versiones de NHibernate UseCompositeId se reemplaza con CompositeId, y WithKeyProperty es solo KeyProperty –

+2

@Rob Walker: También WithReferenceProperty se ha convertido en KeyReference – Mulki

+4

¿Cuál es la diferencia entre KeyProperty y KeyReference en este caso? –

5

si esta es su primera clase

public class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
    UseCompositeId() 
     .WithKeyProperty(x => x.Something) 
     .WithReferenceProperty(x => x.SomethingElse); 
    } 
} 

aquí es el segundo con una referencia en la Entidad

public class SecondEntityMap : ClassMap<SecondEntity> 
    { 
     public SecondEntityMap() 
     { 
     Id(x => x.Id); 

     .... 

     References<Entity>(x => x.EntityProperty) 
      .WithColumns("Something", "SomethingElse") 
      .LazyLoad() 
      .Cascade.None() 
      .NotFound.Ignore() 
      .FetchType.Join(); 

     } 
    } 
1

Puede haber una necesidad de entidades con identificadores compuestos, entidades que se asignan a tablas que tienen claves primarias compuestas, compuestas de muchas columnas. Las columnas que componen esta clave principal generalmente son claves externas a otras tablas.

public class UserMap : ClassMap<User> 
{  
    public UserMap() 
    { 
     Table("User"); 

     Id(x => x.Id).Column("ID"); 

     CompositeId() 
      .KeyProperty(x => x.Id, "ID") 
      .KeyReference(x => x.User, "USER_ID"); 

     Map(x => x.Name).Column("NAME");    

     References(x => x.Company).Column("COMPANY_ID").ForeignKey("ID"); 
    } 
} 

Para mayor referencia: http://www.codeproject.com/Tips/419780/NHibernate-mappings-for-Composite-Keys-with-associ

+1

"Las columnas que componen esta clave principal suelen ser claves foráneas para otras tablas". No, por lo general. En todo caso, ayudan a identificar una entidad de manera única donde una columna no puede hacerlo por sí misma. – user919426

2

Otra cosa a destacar es que es necesario sustituir los métodos equals y GetHashCode para una entidad utilizando un CompositeId. Dado el archivo de asignación de respuestas aceptadas, su entidad se vería así.

public class Entity 
{ 
    public virtual int Something {get; set;} 
    public virtual AnotherEntity SomethingElse {get; set;} 


    public override bool Equals(object obj) 
    { 
     var other = obj as Entity; 

     if (ReferenceEquals(null, other)) return false; 
     if (ReferenceEquals(this, other)) return true; 
     return other.SomethingElse == SomethingElse && other.Something == Something; 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      return (SomethingElse.GetHashCode()*397)^Something; 
     } 
    } 

} 
Cuestiones relacionadas