C# FluentNHibernate子类映射问题:鉴别器失败
我有一个很简单的问题,但现在似乎看不出问题的关键。 我的意图是阅读一份VehicleCollector对象的列表,每个对象都有一个整洁的汽车列表和另一个火车列表。车辆来自单个表,并通过名为TYPE的列进行区分 型号代码: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;
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();