Sql server NHibernate选择N+;1与HasOne映射
我有两个由以下实体建模的表:Sql server NHibernate选择N+;1与HasOne映射,sql-server,linq,nhibernate,fluent-nhibernate,iqueryable,Sql Server,Linq,Nhibernate,Fluent Nhibernate,Iqueryable,我有两个由以下实体建模的表: public class Product : ModifiableEntity { public virtual int ProductId { get; set; } public virtual string Description { get; set; } public virtual ProductStats Stats { get; set; } } public class ProductStats : Modifiabl
public class Product : ModifiableEntity
{
public virtual int ProductId { get; set; }
public virtual string Description { get; set; }
public virtual ProductStats Stats { get; set; }
}
public class ProductStats : ModifiableEntity
{
public virtual int ProductStatId { get; set; }
public virtual int? QtyAvail { get; set; }7
public virtual Product Product { get; set; }
}
使用以下fluent映射:
public class ProductMap : ModifiableEntityClassMap<Product>
{
public ProductMap()
{
Table("Product");
Id(x => x.ProductId).Column("ProductId").GeneratedBy.Identity();
Map(x => x.Description).Column("Description").Nullable().Length(Int32.MaxValue);
HasOne(x => x.Stats)
.PropertyRef(x => x.Product)
.Cascade.All();
}
}
public class ProductStatsMap : ModifiableEntityClassMap<ProductStats>
{
public ProductStatsMap()
{
Table("ProductStats");
Id(x => x.ProductStatId).Column("ProductStatId").GeneratedBy.Identity();
Map(x => x.QtyAvail).Column("QtyAvail").Nullable();
References(x => x.Product).Column("ProductId")
.Unique()
.Cascade.All()
.Not.Nullable();
}
}
我尝试了以下每一种变化:
HasOne(x => x.Stats)
.Not.LazyLoad().Fetch.Join()
.PropertyRef(x => x.Product)
.Cascade.All();
以及在linq查询上指定fetch,但无论我尝试什么,结果都是在我的SQL server上运行数以万计的查询
任何人能提供的任何帮助都将不胜感激
提前谢谢。我认为这里的问题是您需要立即加载产品统计信息。您可以通过两种方式实现这一点:
HasOne(x => x.Stats)
.PropertyRef(x => x.Product)
.Not.LazyLoad()
.Cascade.All();
session.Query<Product>().Fetch(p => p.Stats).ToFuture();
HasOne(x => x.Stats)
.PropertyRef(x => x.Product)
.Not.LazyLoad()
.Cascade.All();
session.Query<Product>().Fetch(p => p.Stats).ToFuture();
session.Query().Fetch(p=>p.Stats.ToFuture();
这将使NHibernate仅在一个数据库往返中执行两个查询。第一个查询将获取产品,第二个查询将获取第一个查询中获取的所有productStats