Chr*_*ian 4 c# nhibernate fluent-nhibernate fluent-nhibernate-mapping
我有一对多的关系,不能让级联工作,一旦我设置级联我只是得到"对象引用一个未保存的瞬态实例......".
我的映射看起来像这样
public class SharedDetailsMapping : ClassMap<SharedDetails>
{
public SharedDetailsMapping()
{
Id(x => x.Id).GeneratedBy.Identity();
HasMany(x => x.Foos);
}
}
public class FooMapping : ClassMap<Foo>
{
public FooMapping()
{
Id(x => x.Id).GeneratedBy.Identity();
References(x => x.SharedDetails).Cascade.SaveUpdate();
}
}
Run Code Online (Sandbox Code Playgroud)
这样的课程
public class Foo
{
public Foo()
{
SharedDetails = new SharedDetails();
SharedDetails.Foos.Add(this);
}
public Foo(SharedDetails sharedDetails)
{
SharedDetails = sharedDetails;
SharedDetails.Foos.Add(this);
}
public virtual Guid Id { get; set; }
public virtual SharedDetails SharedDetails { get; set; }
}
public class SharedDetails
{
public SharedDetails()
{
Foos = new List<Foo>();
}
public virtual Guid Id { get; set; }
public virtual IList<Foo> Foos { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我想创建Foos而不必首先保存SharedDetails,如果它是一个新的Foo,就像这样:
using (var transaction = _session.BeginTransaction())
{
var shared = new SharedDetails();
var fooOne = new Foo(shared);
_session.SaveOrUpdate(fooOne);
var fooTwo = new Foo(shared);
_session.SaveOrUpdate(fooTwo);
transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)
无法弄清楚我做错了什么,如果我首先保存SharedDetails,它的工作原理很糟糕,但这就是为什么我有Cascade设置.
在您的SharedDetailsMapping修改HasMany中添加.Inverse():
public class SharedDetailsMapping : ClassMap<SharedDetails>
{
public SharedDetailsMapping()
{
Id(x => x.Id).GeneratedBy.Identity();
HasMany(x => x.Foos)
.Inverse();
}
}
Run Code Online (Sandbox Code Playgroud)
这指示Foo拥有该关系的NHibernate ,这将帮助它以正确的顺序保存关系中的对象(在这种情况下,SharedDetails必须首先保存,以便在Foo保存时保存其ID ).
关于目的/何时使用Inverse的进一步信息:NHibernate的逆 - 它的真正含义是什么?
TL; DNR版本:
如果您的类中有双向关系(一方是HasMany,另一方是References),那么HasMany应该有.Inverse().
| 归档时间: |
|
| 查看次数: |
7066 次 |
| 最近记录: |