NHibernate-保存简单的父子关系会生成具有指定id的不必要选择
实体:NHibernate-保存简单的父子关系会生成具有指定id的不必要选择,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,实体: public class Parent { virtual public long Id { get; set; } virtual public string Description { get; set; } virtual public ICollection<Child> Children { get; set; } } public class Child { virtual public long Id { get; set;
public class Parent
{
virtual public long Id { get; set; }
virtual public string Description { get; set; }
virtual public ICollection<Child> Children { get; set; }
}
public class Child
{
virtual public long Id { get; set; }
virtual public string Description { get; set; }
virtual public Parent Parent { get; set; }
}
为什么会生成这两个选择?我如何删除它?选择在那里,因为您正在显式设置ID。NHibernate不知道是插入还是更新,所以它必须找出它们是否存在于数据库中。如果他们这样做,它将更新,如果没有(如您的情况),它将插入。这些可能并不一定是不必要的。此外,你没有提到它造成的问题?或者只是你想知道为什么?我真的对nhibernate的持久性机制感到困惑。我在Acion中读过NHibernate,参考手册和几篇关于级联和反向选项的博客文章,但我仍然不清楚。所以我决定尝试几个映射,看看它是如何工作的。
public class ParentMap : ClassMap<Parent>
{
public ParentMap()
{
Id(x => x.Id).GeneratedBy.Assigned();
Map(x => x.Description);
HasMany(x => x.Children)
.AsSet()
.Inverse()
.Cascade.AllDeleteOrphan();
}
}
public class ChildMap : ClassMap<Child>
{
public ChildMap()
{
Id(x => x.Id).GeneratedBy.Assigned();
Map(x => x.Description);
References(x => x.Parent)
.Not.Nullable()
.Cascade.All();
}
}
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
var parent = new Parent { Id = 1 };
parent.Children = new HashSet<Child>();
var child1 = new Child { Id = 2, Parent = parent };
var child2 = new Child { Id = 3, Parent = parent };
parent.Children.Add(child1);
parent.Children.Add(child2);
session.Save(parent);
transaction.Commit();
}
NHibernate: SELECT child_.Id, child_.Description as Descript2_0_, child_.Parent_id as Parent3_0_ FROM [Child] child_ WHERE child_.Id=@p0;@p0 = 2 [Type: Int64 (0)]
NHibernate: SELECT child_.Id, child_.Description as Descript2_0_, child_.Parent_id as Parent3_0_ FROM [Child] child_ WHERE child_.Id=@p0;@p0 = 3 [Type: Int64 (0)]
NHibernate: INSERT INTO [Parent] (Description, Id) VALUES (@p0, @p1);@p0 = NULL[Type: String (4000)], @p1 = 1 [Type: Int64 (0)]
NHibernate: INSERT INTO [Child] (Description, Parent_id, Id) VALUES (@p0, @p1, @p2);@p0 = NULL [Type: String (4000)], @p1 = 1 [Type: Int64 (0)], @p2 = 2 [Type:Int64 (0)]
NHibernate: INSERT INTO [Child] (Description, Parent_id, Id) VALUES (@p0, @p1, @p2);@p0 = NULL [Type: String (4000)], @p1 = 1 [Type: Int64 (0)], @p2 = 3 [Type:Int64 (0)]