Nhibernate:阻止它加入不需要的表

Nhibernate:阻止它加入不需要的表,nhibernate,fluent-nhibernate,nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,我有两个表(tbArea,tbPost)与以下类相关 class Area { int ID string Name ... } class Post { int ID string Title Area Area ... } 这两个类映射到Fluent Nhibernate。下面是post映射 public class PostMapping : ClassMap<Post> { public PostMappin

我有两个表(tbArea,tbPost)与以下类相关

class Area
{
    int ID
    string Name
    ...
}

class Post
{
    int ID
    string Title
    Area Area
    ...
}
这两个类映射到Fluent Nhibernate。下面是post映射

public class PostMapping : ClassMap<Post>
{
    public PostMapping()
    {
        Cache.NonStrictReadWrite();

        this.Table("tbPost");

        Id(x => x.ID)
            .Column("PostID")
            .GeneratedBy
            .Identity();

        References(x => x.Area)
            .ForeignKey("AreaID")
            .Column("AreaID");
        ...
    }
}
我已尝试将Area设置为LazyLoad、Fetch.Select、ReadOnly和引用上的任何其他设置,但它仍将始终加入Area

我正在尝试优化后端数据库查询,因为我不需要加载刚刚筛选的区域对象,所以每次查询post时,我希望消除对区域不必要的连接


我需要更改哪些配置或映射才能使区域仍然与我的对象中的post相关,但在我筛选AreaID时不查询它?

查询代码是什么?这应该行得通

s.CreateCriteria<Post>()
    .Add(Restrictions.Eq("Area.ID", 1))
    .List<Post>();
s.CreateCriteria()
.添加(限制条件Eq(“区域ID”,1))
.List();

使用多对一的id属性时,不需要创建别名。因为,该值已在Post表中。如果在任何其他区域属性上尝试此操作,则需要创建Alias()。

继续搜索后,我发现问题出在Nhibernate Linq库,而不是我的映射或查询。我想我之所以不能找到更多关于这个问题的信息,是因为大多数使用ORM的人都不看生成的查询。不管怎样,这里的链接证实了我的问题

我想出了两个解决办法。虽然使用CreateCriteria确实创建了正确的查询,但它与我实现访问层的方式不符。我仍然需要基于传入的
表达式
语句执行where语句。我找到的两种可能的解决方案是:

  • 使用此库从lambda语句中创建条件

    lambda扩展的功能不如我所希望的那样好,但可能适用于具有相同问题的其他扩展

  • 最后,在我的查询中使用Linq的最佳解决方案是下载并构建NHibernate3的开发版本。NH3中新的Linq提供程序工作得非常完美,查询看起来和我预期的一样


  • 不熟悉NHibernate,但据我所知,它与LINQ相似

    例如,我有两个表:

    顾客 命令

    1个客户有0个订单

    通过LINQ更新订单将更新附加的客户。在我的例子中,它是在表中插入一个重复的客户

    我必须在order类中为实现一个
    Detach()
    方法

    伪代码:

    public void Detach()
    {
       this._ReferenceToCustomer = emptyCustomerReference;
    }
    

    这个想法是将客户从订单中分离出来。这就是您想要的吗?

    我必须使用session.Query()。其中(x=>x.ID==ID)。原因是我有一个中间接口,它通过expression进行过滤。是否有方法使用createcriteria执行表达式linq where语句,或者通过Query()执行此操作?它可能不是重复的,但可能会对您有所帮助:您可以将代码发布到发出查询的位置吗?
    public void Detach()
    {
       this._ReferenceToCustomer = emptyCustomerReference;
    }