gpt4 book ai didi

c# - NHibernate 和继承创建意外的双重查询行为?

转载 作者:太空狗 更新时间:2023-10-30 01:27:16 27 4
gpt4 key购买 nike

我正在使用 FluentNHibernate。我没有使用自动映射。我有一个子类化的基类。当我查询基类时,它会对子类执行额外的查询。这是我正在做的(人为的)示例:

public class Foo
{
int Id;
string SomeValue;
}

我创建了另一个代表第一个审计记录的类并继承了它:

public class FooAudit : Foo
{
DateTime DateModified;
}

我为每个转到它们自己的表创建单独的映射:

public class FooMap : ClassMap<Foo>
{
public FooAuditMap()
{
Table("Foo");
Id(x => x.Id).Column("FOO_ID");
Map(x => x.SomeValue).Column("SOME_VALUE");
}
}

public class FooAuditMap : ClassMap<FooAuditMap>
{
public FooAuditMap()
{
Table("FooAudit");
CompositeId()
.KeyProperty(x => x.DateModified, c => c.ColumnName("AUDIT_DATE"));
.KeyProperty(x => x.Id, c => c.ColumnName("FOO_ID"));
Map(x => x.SomeValue).Column("SOME_VALUE");
}
}

我对 Foo 执行查询:

public virtual IEnumerable<Foo> List()
{
using (var session = SessionFactory.OpenSession())
{
return session.CreateCriteria<Foo>().List<Foo>();
}
}

然后两次访问数据库,一次针对 Foo 执行该查询,另一次针对 FooAudit。

为什么要进行两次查询?我生成了 HBM 文件,但绝对没有链接这些类的内容。

编辑:为了完整起见,这就是 Bootstrap 配置的样子。

public static ISessionFactory CreateSessionFactory()
{
return Fluently
.Configure()
.Database
(
FluentNHibernate.Cfg
.Db.MsSqlConfiguration.MsSql2005
.ConnectionString(GetConnectionString())
)
.Mappings(m => m
.FluentMappings.AddFromAssemblyOf<Foo>()
.Conventions.Add(typeof(EnumConvention)))
.BuildSessionFactory();
}

最佳答案

您看到的是预期的行为。

查询基类也会查询任何继承类。

如果有一个明确的 NHibernate 映射(子类、联合子类等),那将只是一个查询。否则,它被认为是一个隐式多态定义,并且发出两个查询以返回所有它们的结果。

我相信(来自文档;我还没有尝试过)您可以通过使用 polymorphism="explicit" 映射类来避免这种情况。不知道Fluent是否支持。

关于c# - NHibernate 和继承创建意外的双重查询行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3151048/

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