我有一个一对多的关系并且无法让级联工作,一旦我设置了级联,我只会得到“对象引用一个未保存的 transient 实例......”。

我的映射看起来像这样

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();
    }
}

这样的课
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; }
}

然后我想创建 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();
}

无法弄清楚我做错了什么,如果我先保存 SharedDetails 会产生诅咒,但这就是我进行 Cascade 设置的原因。

最佳答案

在您的 SharedDetailsMapping 中,修改您的 HasMany 以添加 .Inverse() :

public class SharedDetailsMapping : ClassMap<SharedDetails>
{
    public SharedDetailsMapping()
    {
        Id(x => x.Id).GeneratedBy.Identity();
        HasMany(x => x.Foos)
           .Inverse();
    }
}

这指示 NHibernate Foo 拥有关系,这将帮助它以正确的顺序保存关系中的对象(在这种情况下,SharedDetails 必须先保存,所以我们在保存 Foo 时就有了它的 ID)。

有关目的/何时使用 Inverse 的更多信息:NHibernate's inverse - what does it really mean?

TL;DNR 版本:

如果您的类中有双向关系(一侧为 HasMany,另一侧为 References),则 HasMany 应具有 .Inverse()

关于c# - Fluent nhibernate 一对多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13098955/

10-10 06:32