문제

I've the following 3 table's with example values of

Vehicles ( id = 1, type_id = 20 , ... )
Vehicle_Types ( vt_id = 20, class_id = 160, ... )
Vehicle_Classes ( vcls_id = 160, name = "Concrete1" )

I've got

public class Concrete1 : Vehicle
{

}

And I want nhibernate to instantiate an Concrete1 when loading vehicle #1 in

Vehicle /*Concrete1*/ v = session.load<Vehicle>(1);

How could I do that with automappings? Thanks in advance.

Edit1

I'm starting to think this is impossible, therefore any workaround would be appreciated. Any clue for the xml (non fluent) version might be of a great help either.

도움이 되었습니까?

해결책

OK, first, the bad news.

  • You can't have the discriminator in a separate table, period. You could hack around this by using a select statement with a join as the source table, but then your entity would be effectively read-only. Or you can use a view, which could work, but delegates more work to the DB.
  • Even with correct mapping, session.load<Vehicle>(1) will never return a derived type (except if you disable lazy-loading, which is a bad idea, or if the concrete instance was already loaded as such in the session). You can get the concrete instance with this hack.

Now, your data model looks like it would work better with a Vehicle has-a Type relationship than a <ConcreteVehicle> is-a Vehicle one.

This gives you more flexibility (you could change the type of a vehicle, for example), and you can keep polymorphism features by using a strategy pattern (the vehicle type contains the behavior).

다른 팁

I think this post on the nhibernate.info blog does what you are looking to do.

http://nhibernate.info/blog/2011/02/16/get-load-polymorphism-in-nhibernate-3.html

If not it might give you an idea.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top