如何使用NHIbernate将未持久化的对象附加到从DB加载的对象

时间:2011-04-29 14:09:52

标签: c# nhibernate fluent-nhibernate

我有一个看起来像这样的实体:

public class Driver
{
    IVehicle Vehicle {get;set;}
}

和几个实现IVehicle(汽车,自行车,火车......)的不同类

如何选择我的驱动程序所具有的IVehicle的具体实现,并在下次从数据库加载驱动程序时记住此选择?

我正在使用NHibernate 3.0与FluentNHibernate一起进行持久化以进行映射。

修改

好的,我终于明白了。我需要映射车辆并按以下方式映射每个子类:

public void VehicleMap : ClassMap<IVehicle>
{
    public VehicleMap()
    {
        Id(v => v.Id); // Needed to add a property which will be used as Id
         DiscriminateSubClassesOnColumn("TYPE");
    } 
}

public void CareMap : SubclassMap<Car>
{
    public CarMap()
    {
         DiscriminatorValue("CAR");
    }
}

此外,我需要从驱动程序映射

禁用车辆的延迟加载

1 个答案:

答案 0 :(得分:1)

您需要确定继承映射的工作方式。请参阅文档http://nhibernate.info/doc/nh/en/index.html#inheritance

一旦这样做,您可以映射您的Driver类以级联Vehicle依赖项。在那之后,NHibernate将自动从数据库中加载正确的项目。

<强>更新

您需要将类型名称保留为字符串。然后您的Vehicle类可以是一个未映射的属性,它可以执行以下操作:

public class Driver
{
    private string vehicleTypeName;
    private IVehicle vehicle;

    public IVehicle Vehicle
    {
        get
        {
            if (vehicle == null)
            {
                vehicle = typeof(IVehicle).Assembly
                                   .CreateInstance(vehicleTypeName);
            }
            return vehicle;
        }
    }
}