gpt4 book ai didi

c# - FluentNHibernate SubClassMap 问题 : Discriminator fail

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:57 24 4
gpt4 key购买 nike

我有一个非常简单的问题,但现在似乎看不出重点。我的目的是读取 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 { }

映射代码:

public class FooMap : ClassMap<VehicleCollector>
{
public FooMap()
{
this.HasMany(x => x.Cars).KeyColumn("foo_id");
this.HasMany(x => x.Trains).KeyColumn("foo_id");
}
}

public class VehicleMap : ClassMap<Vehicle>
{
public VehicleMap() { this.DiscriminateSubClassesOnColumn("type"); }
}

public class CarMap : SubclassMap<Car>
{
public CarMap() { this.DiscriminatorValue(1); }
}

public class TrainMap : SubclassMap<Train>
{
public TrainMap() { this.DiscriminatorValue(2); }
}

我故意省略了 ID 和其他属性以保持其可读性。如果您按原样运行它,它不会编译。

实际发生的是所有车辆都被加载到其中一个集合中,因此 - 据我所知 - 忽略了鉴别器。

你知道我在这里可能遗漏了什么/做错了什么吗?

编辑: 我刚刚将 SchemaExport 运行到 SQLite 以查看其行为方式。这里有一些关于正在发生的事情的更多细节 - 一步一步。注意:某些属性可能已更改/已添加。

1) 架构导出

 create table vehicle_collector
(
id INTEGER not null,
name TEXT not null,
primary key (id)
);

create table vehicle (
id INTEGER not null,
desc TEXT not null,
type TEXT not null,
collector_id INTEGER,
primary key (id)
);

2) 插入

VehicleCollector c = new VehicleCollector() { Id = 1001, Name = "foobar" };
Train v2 = new Train() { Id = 101, desc = "Foo" };
Car v1 = new Car() { Id = 102, desc = "Bar" };
c.Cars.Add(v1);
c.Trains.Add(v2);
openSession.Save(c);

这导致以下 SQL(请注意,NHibernate 将鉴别器放置为静态字符串):

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;

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

这会导致以下 SQL(为什么这里没有鉴别器?生成的第一个 select 语句中的 @p1 是什么?):

 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;

很明显,NHibernate 2.1 在使用鉴别器进行选择时遇到了麻烦,同时按预期插入工作。有什么新鲜的想法吗?

TIA

最佳答案

我遇到过类似(如果不相同)的事情,其中​​选择内容不起作用,因为它不包括任何鉴别器信息。要强制始终包含鉴别器信息,请添加:

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

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

关于c# - FluentNHibernate SubClassMap 问题 : Discriminator fail,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6870467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com