2017-09-30 1 views
0

Bitte sehen Sie den Code unten:einen Composite-Primärschlüssel in der Verknüpfungstabelle mit NHibernate

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

using NHibernate.Mapping.ByCode; 
using NHibernate.Mapping.ByCode.Conformist; 

namespace NHibernateCodeMapping 
{ 
    public class Person 
    { 
     public virtual Guid Id { get; set; } 
     public virtual string Name { get; set; } 
     public virtual IList<Sport> sports { get; set; } 

     public Person() 
     { 
      sports = new List<Sport>(); 
     } 
    } 

    public class Sport 
    { 
     public virtual Guid Id { get; set; } 
     public virtual string Description { get; set; } 
     public virtual IList<Person> people { get; set; } 

     public Sport() 
     { 
      people = new List<Person>(); 
     } 
    } 

    public class PersonMap : ClassMapping<Person> 
    { 
     public PersonMap() 
     { 
      Id<Guid>(x => x.Id); 
      Property<string>(x => x.Name); 

      Bag(x => x.sports, collectionMapping => 
      { 
       collectionMapping.Table("PersonSports"); 
       collectionMapping.Cascade(Cascade.None); 
       collectionMapping.Key(keyMapper => keyMapper.Column("PersonId")); 
       //collectionMapping.Key(k => k.Column("SportId")); 
      }, 
      map => map.ManyToMany(p => p.Column("SportId"))); 
     } 
    } 

    public class SportMap : ClassMapping<Sport> 
    { 
     public SportMap() 
     { 
      Id<Guid>(x => x.Id); 
      Property<string>(x => x.Description); 
      Bag(x => x.people, collectionMapping => 
      { 
       collectionMapping.Table("PersonSports"); 
       collectionMapping.Key(keyMapper => keyMapper.Column("SportId")); 
       collectionMapping.Cascade(Cascade.None); 
       //collectionMapping.Key(k => k.Column("PersonId")); 
      }, 
      map => map.ManyToMany(p => p.Column("PersonId"))); 
     } 
    } 
} 

Es funktioniert wie ich erwarten würde das heißt drei Tabellen erstellt: Person; Sport und PersonSport. PersonSport ist der Knotenpunkt, um die Beziehung zwischen Mensch und Sport zu unterstützen.

Wie erstelle ich einen zusammengesetzten Primärschlüssel für die PersonSport-Tabelle (Personid, SportId)? Bitte sieh dir die zwei Zeilen an, die auskommentiert sind, was zeigt, was ich bisher versucht habe.

Antwort

0

Es funktioniert wie erwartet, wenn ich die folgenden Klassen hinzu:

public class SportMap : ClassMapping<Sport> 
    { 
     public SportMap() 
     { 
      Id<Guid>(x => x.Id); 
      Property<string>(x => x.Description); 
      Bag(x => x.people, collectionMapping => 
      { 
       collectionMapping.Table("PersonSports"); 
       //collectionMapping.Key(keyMapper => keyMapper.Column("SportId")); 
       collectionMapping.Cascade(Cascade.None); 
       collectionMapping.Key(k => k.Column("PersonId")); 
      }, 
      map => map.ManyToMany(p => p.Column("SportId"))); 
     } 
    } 

    public class PersonSports 
    { 
     public virtual Guid SportId { get; set; } 
     public virtual Guid PersonId { get; set; } 

     public override bool Equals(object obj) 
     { 
      return true; 
     } 

     public override int GetHashCode() 
     { 
      return 1; 
     } 
    } 

    public class PersonSportsMap : ClassMapping<PersonSports> 
    { 
     public PersonSportsMap() 
     { 
      ComposedId(map => 
      { 
       map.Property(x => x.PersonId); 
       map.Property(x => x.SportId); 
      }); 
     } 
    } 

Deshalb habe ich zu:

1) die Sammlungen in den Klassen erstellen (Person.Sports und Sports.Person) dort Sinn sind effektiv zwei eins zu viele Beziehungen.

und

2) Erstellen Sie die Verknüpfungstabelle explizit

Ich bin nicht sicher, ob dies normale Praxis ist (beide der oben genannten zu tun) und würde für einige Kommentare dankbar.

Verwandte Themen