私はdocやGoogleで別段の言及が見られていないので、nhibernateが循環参照の問題を処理できると仮定しています。nhibernateカスケードは、循環参照を持つオブジェクトのセットを保存する方法はありますか?
私がメンバとして自身のインスタンスへの参照を持つクラスがあると仮定:
例えば
class A
{
A Other;
}
私はその後、私はセッションに保存しようとする場合、そのようなことを、これらのクラスのマッピングのセットを生成したい、それを2つのオブジェクトを作成し、それらを相互参照相互
A a1 = new A();
A a2 = new A();
a1.Other = a2;
a2.Other = a1;
を持っていますbへの参照が保持されるような方法でbを保存します。
は、現時点では私はmany-to-one関連使用して単純なマッピングを生産している(実際にはこれが流暢NHibernateはによって生成されますが、手動検査でOKになります)
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="">
<class name="hibernate.experiment.CircularRefQn+A, hibernate.experiment, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`A`" xmlns="urn:nhibernate-mapping-2.2">
<id name="Id" type="Int32" column="Id">
<generator class="identity" />
</id>
<many-to-one cascade="all" name="Other" column="Other_id" />
</class>
</hibernate-mapping>
をしかし、私は、A1を保存するときa2への参照をデータベースに保存しません。どうすればこのようにすることができますか?
流暢なnhibernateを使用しているサンプルコードはここにあります(nhibernate、fluent-nhibernate、nunitが必要です - もし人々が削除されたバージョンを知りたい場合)。
自分自身を参照するa3オブジェクトも作成しましたが、これは私が望むように保存しません。
using System.IO;
using FluentNHibernate.Cfg;
using FluentNHibernate.Mapping;
using NHibernate.Tool.hbm2ddl;
using NUnit.Framework;
namespace hibernate.experiment
{
[TestFixture]
public class CircularRefQn
{
[Test]
public void Test()
{
var file = this.GetType().Name + ".db";
if (File.Exists(file))
File.Delete(file);
var fcfg = Fluently.Configure()
.Database(FluentNHibernate.Cfg.Db.SQLiteConfiguration.Standard
.UsingFile(file))
.Mappings(m =>
{
m.FluentMappings.Add(typeof(A.Map));
m.FluentMappings.ExportTo(".");
})
.ExposeConfiguration(cfg => new SchemaExport(cfg).Create(true, true))
;
var sFactory = fcfg.BuildSessionFactory();
using (var s = sFactory.OpenSession())
{
A a1 = new A();
A a2 = new A();
a1.Other = a2;
a2.Other = a1;
Assert.NotNull(a1.Other);
Assert.NotNull(a2.Other);
A a3 = new A();
a3.Other = a3;
s.Save(a1);
s.Update(a1);
s.Save(a3);
}
using (var s = sFactory.OpenSession())
{
foreach (var a in s.CreateCriteria(typeof(A)).List<A>())
Assert.NotNull(a.Other);
}
}
public class A
{
public virtual int Id { get; set; }
public virtual A Other { get; set; }
public class Map : ClassMap<A>
{
public Map()
{
Id(x => x.Id);
References(x => x.Other)
.Cascade.All();
}
}
}
}
}
ありがとうございました。これは私がセッションについての愚かな仮定を作るために得るものです。 – fostandy