0

我想知道有沒有辦法在不創建視圖的情況下連接兩個具有兩個非主鍵列的表?我有一個名爲'Make'的表,名爲'Name'和'Year'的列,我想用列'MakeName'和'MakeYear'與另一個名爲'Style'的表連接。一個'做'可以有很多'風格'。 這裏是我到目前爲止創建實體:Fluent Nhibernate映射通過兩個非主鍵列加入

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

而且這些都是類地圖我到目前爲止:

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

謝謝!

+0

你不得不使用那些實體?如果您可以創建更強大的模型,那麼您的映射問題就會減少。 爲什麼你需要將Style.MakeName加入Make.Name?爲什麼不直接加入Make呢? – mbp 2011-12-30 22:22:21

+0

這是一個現有的模式?如果不是,我會第二個MBP – Firo 2012-01-01 19:36:32

回答

4

3個選項在那裏我會prefere第一

  1. 選項:

    變化db schema包括廠名id而不是名稱,一年分爲裝飾表

  2. 選項

References(x => x.Make) 
    .Formula("(Select s.Id FROM Style s WHERE s.Name = MakeName AND s.Year = MakeYear)"); 
  • 選項
  • 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"); 
        } 
    }