2017-02-10 212 views
0

我有以下型號NHibernate的映射,映射對象

public class Car : Entity<int> 
{ 
    public virtual int Id{ get; set; } 
    ... 
    public virtual Engine Engine { get; set; } 

} 

,我使用nhibernate mapping by code approach

public class CarMap : ClassMapping<Car> 
{ 
    public CarMap() 
    { 
     Id(x => CarId, m => m.Generator(Generators.Identity)); 
     // how map reference Engine? 
     **// edit** 
     HasOne(x=>x.Engine, m=>{}) // is this good enough? 

    } 
} 

如何在此地圖引擎CarMap對象?

回答

0

用流利的NH,我會用References(),其中有ManyToOne()顯然是一個mapping-by-code equivalent

+0

你確定它是ManyToOne不OneToOne? – user1765862

+0

我沒有使用映射代碼,我只是繼續討論鏈接的文章所說的內容。它從2012年開始,所以事情可能已經改變...... –

+0

謝謝....,。,,, – user1765862

1

你需要更多的信息,但這裏有幾個選項。

這真的是一對一的關係嗎?一對一的關係在某種程度上是獨一無二的,因爲雙方的關係傾向於共享同一個Id。就像大衛奧斯本說,你很可能想要一對多的關係。但是你希望它是雙向的?即,您可以從引擎向下導航到所有可能具有該引擎的汽車或從汽車上升到特定引擎的汽車。即發動機是克萊斯勒Hemi發動機5.7L,在汽車,Ram Pickup,道奇Durango,道奇Charger。

那麼你可能想映射這樣

public class Engine : Entity<int> 
{ 
    public Engine() 
    { 
     Cars = new List<Car>(); 
    } 

    public virtual int Id { get; protected set; } 
    public virtual decimal Displacement { get; set; } 
    //more properties 

    public virtual IList<Car> Cars { get; } 

    public virtual void AddCar(Car car) 
    { 
     if (Cars.Contains(car)) return; 

     Cars.Add(car); 
    } 

    public virtual void RemoveCar(Car car) 
    { 
     if (!Cars.Contains(car)) return; 

     Cars.Remove(car); 
    } 
} 

public class Car : Entity<int> 
{ 
    public virtual int Id { get; set; } 
    public virtual Engine Engine { get; set; } 

} 

的對象,因此,如果您正在映射,你需要定義汽車映射列表中的引擎這個

 Bag(x => x.Cars, map => 
     { 
      map.Key(k => k.Column(col => col.Name("EngineId"))); 
      map.Cascade(Cascade.All | Cascade.DeleteOrphans); //optional 
     }, 
      action => action.OneToMany()); 

和的另一面像這樣的關係

 ManyToOne(x => x.Engine, map => 
     { 
      map.Column("EngineId"); 
      map.NotNullable(true); // if you require the Engine to be in a car 
     }); 

如果你只是想從汽車的單向映射到en gine,只需刪除對Cars列表的所有引用並刪除Bag映射。