4

私は1対多の関係にあり、カスケードを機能させることができません。カスケードを設定すると、「オブジェクトは保存されていない一時インスタンスを参照します...」というメッセージが表示されます。

私のマッピングは次のようになります

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

次に、次のように、新しいFooの場合、最初にSharedDetailsを保存せずにFoosを作成します。

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を設定しているのはそのためです。

4

1 に答える 1

6

で、SharedDetailsMappingを変更HasManyして追加し.Inverse()ます。

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

これは、リレーションシップを所有するNHibernateに指示しFooます。これは、リレーションシップ内のオブジェクトを正しい順序で保存するのに役立ちます(この場合、SharedDetails最初に保存する必要があるため、保存時にIDを取得しますFoo)。

インバースを使用する目的/タイミングに関する詳細情報:NHibernateのインバース-それは実際にはどういう意味ですか?

TL; DNRバージョン:

クラスに双方向の関係がある場合(一方がHasMany、もう一方がReferences)、HasManyにはが必要.Inverse()です。

于 2012-10-27T09:47:36.780 に答える