我开始使用nHibernate并有一个简单的例子,我无法按照自己的意愿工作.
我有两个模型对象(博客和帖子),我想在一个场景的单个查询中加载它们.我想在其他情况下延迟加载.
我天真地以为我可以这样写:
var blogs = session.Linq<Blog>().Expand("Posts");
但是,这将为每个帖子提供一个博客实例,而不是将帖子添加到博客中.
我知道我做的事情很愚蠢.有人可以指出它是什么?我需要在linq查询中关联帖子和博客实体吗?
代码和映射:
public class Blog
{
public Blog()
{
Posts = new HashSet<Post>();
}
public virtual long Identifier { get; set; }
public virtual string Name { get; set; }
public virtual ICollection<Post> Posts { get; set; }
public virtual Post AddPost(Post post)
{
post.Blog = this;
Posts.Add(post);
return post;
}
}
public class Post
{
public virtual long Identifier { get; set; }
public virtual string Name { get; set; }
public virtual Blog Blog { get; set; }
}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibEx" namespace="nhibEx">
<class name="Blog" lazy="true">
<id name="Identifier">
<generator class="native" />
</id>
<property name="Name" not-null="true" length="100"/>
<set name="Posts" inverse="true" cascade="save-update" lazy="true">
<key column="BlogIdentifier" foreign-key="fk_Post_Blog"/>
<one-to-many class="Post"/>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="nhibEx" namespace="nhibEx">
<class name="Post" lazy="true">
<id name="Identifier">
<generator class="native" />
</id>
<property name="Name" not-null="true" length="255"/>
<many-to-one name="Blog" column="BlogIdentifier" class="Blog" />
</class>
</hibernate-mapping>
最佳答案 区别是你需要的……
编辑:
当它不起作用时:在tolist之后执行distinct.
我不知道为什么NHibernate会加载与返回的数据库记录数相同数量的对象,并且不会自动执行不同的操作.此问题/功能不是Linq特定的,但在使用条件或hql时也会发生.
session.Linq<Blog>().Expand("Posts").ToList().Distinct();
有时,执行2个查询(单独或使用多个查询/将来)比使用左外连接执行一个查询更有效.