nhibernate映射通过代码方法,映射对象

时间:2017-02-10 10:36:53

标签: c# .net 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对象中映射引擎?

2 个答案:

答案 0 :(得分:1)

您需要在问题中提供更多信息,但这里有两个选项。

这真的是一对一的关系吗?一对一的关系有点独特,因为关系的双方倾向于共享相同的Id。像大卫奥斯本一样,你很可能想要一对一的关系。但是你想要它是双向的吗?也就是说,您可以从发动机向下导航到可能具有该发动机或从汽车到特定发动机的所有汽车。即发动机是克莱斯勒Hemi发动机5.7L,它在汽车,Ram皮卡,道奇Durango,道奇充电器。

然后你可能想要像这样映射对象

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

如果您只想要从汽车到引擎的单向映射,只需删除所有对汽车列表的引用并删除行李映射。

答案 1 :(得分:0)

使用Fluent NH,我会使用References(),显然mapping-by-code equivalent ManyToOne()