C# FluentNHibernate子类映射问题:鉴别器失败

C# FluentNHibernate子类映射问题:鉴别器失败,c#,.net,nhibernate,fluent-nhibernate,nhibernate-mapping,C#,.net,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有一个很简单的问题,但现在似乎看不出问题的关键。 我的意图是阅读一份VehicleCollector对象的列表,每个对象都有一个整洁的汽车列表和另一个火车列表。车辆来自单个表,并通过名为TYPE的列进行区分 型号代码: public class VehicleCollector { public virtual IList<Car> Cars { get; set; } public virtual IList<Train> Trains { get;

我有一个很简单的问题,但现在似乎看不出问题的关键。 我的意图是阅读一份VehicleCollector对象的列表,每个对象都有一个整洁的汽车列表和另一个火车列表。车辆来自单个表,并通过名为TYPE的列进行区分

型号代码:

public class VehicleCollector
{
    public virtual IList<Car> Cars { get; set; }
    public virtual IList<Train> Trains { get; set; }
}

public class Vehicle { }

public class Car : Vehicle {}

public class Train : Vehicle { }
2)插入

VehicleCollector v1 = openSession.CreateCriteria<VehicleCollector>()
                                    .Add(Restrictions.Eq("Id", 1001L))
                                    .SetMaxResults(1)
                                    .List<VehicleCollector>()
                                    .First();
Assert.AreEqual(1, v1.Cars.Count);
Assert.AreEqual(1, v1.Trains.Count);
这将产生以下SQL(请注意,NHibernate将鉴别器作为静态字符串放置):

3)选择

VehicleCollector v1 = openSession.CreateCriteria<VehicleCollector>()
                                    .Add(Restrictions.Eq("Id", 1001L))
                                    .SetMaxResults(1)
                                    .List<VehicleCollector>()
                                    .First();
Assert.AreEqual(1, v1.Cars.Count);
Assert.AreEqual(1, v1.Trains.Count);
很明显,NHibernate 2.1在按预期插入作品时,使用鉴别器进行选择时遇到问题。有什么新的想法吗


TIA

我曾经遇到过类似的情况(如果不是相同的话),选择东西不起作用,因为它不包括任何鉴别器信息。要强制始终包含鉴别器信息,请添加以下内容:

this.DiscriminateSubClassesOnColumn("type").AlwaysSelectWithValue();

这将强制在查询中包含鉴别器信息。

测试了您的配置(添加ID)-没有任何问题。这是我的测试代码:。不知道您的添加/查询方法是否存在问题。嗨,Richard,我也有类似的工作,但一旦我使用新会话读取持久数据,就会出现我在原始帖子中描述的错误。有趣的是,使用鉴别器插入工作正常……我仍然无法产生错误。我使用的是FNH1.2/NH3.1/MSSQL,所以我切换到FNH1.1.0/NH2.1/Sqlite。我在同一个sqlite会话中运行insert/query,这可能就是我的断言工作的原因。(然而,我最初对MSSQL的断言是在一个单独的会话中)将不得不稍后在适当的测试中进行尝试。Sqlite和FNH是一种奇怪的伙伴,尤其是在测试环境中。你可能想看看这篇帖子:(顺便说一句,
@p1
在查询中是
限制1
-一个sqlite特性)嗨,Richard,这种行为不能在你的机器上复制的事实让我感到恐惧…docmanhattan的想法是对的,所以我将在AlwaysSelectWithValue上查看文档,以了解它的作用。谢谢,Docmanhattan,它使用AlwaysSelectWithValue按预期工作。
INSERT INTO vehicle_collector (name, id) VALUES (@p0, @p1); @p0 = 'foobar', @p1 = 1001;
INSERT INTO vehicle (desc, type, id) VALUES ( @p1, '2', @p2); @p1 = 'Foo', @p2 = 101;
INSERT INTO vehicle (desc, type, id) VALUES ( @p1, '1', @p2); @p1 = 'Bar', @p2 = 102;
UPDATE vehicle SET collector_id = @p0 WHERE id = @p1; @p0 = 1001, @p1 = 101;
UPDATE vehicle SET collector_id = @p0 WHERE id = @p1; @p0 = 1001, @p1 = 102;
VehicleCollector v1 = openSession.CreateCriteria<VehicleCollector>()
                                    .Add(Restrictions.Eq("Id", 1001L))
                                    .SetMaxResults(1)
                                    .List<VehicleCollector>()
                                    .First();
Assert.AreEqual(1, v1.Cars.Count);
Assert.AreEqual(1, v1.Trains.Count);
 SELECT this_.id as id0_0_, this_.name as name0_0_
   FROM vehicle_collector this_
  WHERE this_.id = @p0 limit 1;
 @p0 = 1001, @p1 = 1;

 SELECT vehicle0_.collector_id as collector5_1_,
        vehicle0_.id        as id1_,
        vehicle0_.id        as id1_0_,
        vehicle0_.desc      as desc1_0_
   FROM vehicle vehicle0_
  WHERE vehicle0_.collector_id = @p0;
 @p0 = 1001;
this.DiscriminateSubClassesOnColumn("type").AlwaysSelectWithValue();