Nhibernate:阻止它加入不需要的表
我有两个表(tbArea,tbPost)与以下类相关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
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语句。我找到的两种可能的解决方案是:
不熟悉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;
}