Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server NHibernate选择N+;1与HasOne映射_Sql Server_Linq_Nhibernate_Fluent Nhibernate_Iqueryable - Fatal编程技术网

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上运行数以万计的查询

任何人能提供的任何帮助都将不胜感激


提前谢谢。

我认为这里的问题是您需要立即加载产品统计信息。您可以通过两种方式实现这一点:

  • 在映射Stats属性时添加.Not.LazyLoad(),如下所示:

    HasOne(x => x.Stats)
        .PropertyRef(x => x.Product)
        .Not.LazyLoad()
        .Cascade.All();
    
    session.Query<Product>().Fetch(p => p.Stats).ToFuture();
    
  • 通过使用名称空间NHibernate.Linq,如下所示:

    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

  • 第一种方法的唯一问题是它会影响您执行的每个查询。另一方面,只有在您真正需要时,才可以使用第二种方法

    尽管如此,仍然有一些问题困扰着我:你真的需要统计中的“产品”属性吗?因为循环引用可能会有一些问题