0

Je me demandais s'il existe un moyen de joindre deux tables avec deux colonnes de clés non primaires sans créer de vue? J'ai une table appelée 'Make' avec des colonnes de 'Name' et 'Year' que je veux joindre avec une autre table appelée 'Style' avec les colonnes 'MakeName' et 'MakeYear'. Un 'Make' peut avoir beaucoup de 'Style'. Voici les entités que j'ai créées jusqu'à présent:Fluid Nhibernate mappage à rejoindre par deux colonnes de clé non primaires

public class Make 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Year { get; set; } 
    public virtual IList<Style> Styles { get; set; } 
} 

public class Style 
{ 
    public virtual int Id { get; set; } 
    public virtual string MakeName { get; set; } 
    public virtual string MakeYear { get; set; } 
    public virtual string Class { get; set; } 
    public virtual Make Make { get; set; } 
} 

également sont les cartes de classe que j'ai jusqu'à présent:

public class MakeMap : ClassMap<Make> 
{ 
    public MakeMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Year); 
     // Bad mapping... 
     //HasManyToMany(x => x.Styles).Table("Make").AsBag() 
      .ParentKeyColumn("MakeName") 
      .ChildKeyColumn("MakeYear").Cascade.All(); 
     Table("Make"); 
    } 
} 

public class StyleMap : ClassMap<Style> 
{ 
    public StyleMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Class); 
     Map(x => x.MakeName); 
     Map(x => x.MakeYear); 
     // Ends up overwriting the "MakeName" column 
     References(x => x.Make).Column("MakeName").PropertyRef("Name"). 
       Column("MakeYear").PropertyRef("Year"); 
     Table("Style"); 
    } 
} 

Merci!

+0

Êtes-vous obligé d'utiliser ces entités? Si vous pouvez créer un modèle plus robuste, vous aurez moins de problèmes de mappage. Pourquoi avez-vous besoin de joindre Style.MakeName à Make.Name? Pourquoi ne pas faire la jointure directement au Make? – mbp

+0

est-ce un schéma existant? Si non, je serais deuxième mbp – Firo

Répondre

4

3 des options où je préfére le premier

  1. Option:

    changer la db schema pour inclure la marque id au lieu du nom et l'année dans la table de style

  2. Option

References(x => x.Make) 
    .Formula("(Select s.Id FROM Style s WHERE s.Name = MakeName AND s.Year = MakeYear)"); 
  1. Option
public class Make 
{ 
    public virtual int Id { get; set; } 

    public virtual MakeId BusinessId { get; private set; } 
} 

public class MakeId 
{ 
    public virtual string Name { get; set; } 
    public virtual string Year { get; set; } 
} 

public class MakeMap : ClassMap<Make> 
{ 
    public MakeMap() 
    { 
     Id(x => x.Id); 
     Component("BusinessId", c => 
      c.Map(x => x.Name); 
      c.Map(x => x.Year); 
     }); 

     HasMany(x => x.Styles) 
      .PropertyRef("BusinessId") 
      .KeyColumns.Add("MakeName", "MakeYear") 
      .Cascade.All(); 
     Table("Make"); 
    } 
} 

public class StyleMap : ClassMap<Style> 
{ 
    public StyleMap() 
    { 
     Table("Style"); 

     Id(x => x.Id); 
     Map(x => x.Class); 

     References(x => x.Make) 
      .PropertyRef("BusinessId") 
      .Columns.Add("MakeName", "MakeYear"); 
    } 
} 
Questions connexes