0

FluentNhibernate で簡単なテスト アプリケーションを試してみましたが、期待どおりに動作しません。ここに私のクラスがあります:

public class Document : DataEntity
{
    public virtual string Title { get; set; }

    public virtual string FileName { get; set; }

    public virtual DateTime LastModificationDate { get; set; }

    public virtual User LastModificationBy { get; set; }

    public virtual byte[] Content { get; set; }

    public virtual User Owner { get; set; }
}

public class User : DataEntity
{
    public virtual string FirstName { get; set; }

    public virtual string LastName { get; set; }

    public virtual string Login { get; set; }

    public virtual string PasswordHash { get; set; }

    public virtual string Email { get; set; }

    public virtual IList<Document> OwnedDocuments { get; set; }

    public User()
    {
        this.OwnedDocuments = new List<Document>();
    }
}

internal class UserMapping : ClassMap<User>
{
    public UserMapping()
    {
        this.Id(x => x.Id);
        this.Map(x => x.FirstName);
        this.Map(x => x.LastName);
        this.HasMany(x => x.OwnedDocuments).Inverse();
    }
}

    public DocumentMapping()
    {
        this.Id(x => x.Id);
        this.Map(x => x.Title);
        this.Map(x => x.FileName).Not.Nullable();
        this.Map(x => x.LastModificationDate).Index("IDX_ModificationDate");
        this.Map(x => x.Content);
        this.References(x => x.LastModificationBy).Column("LastModificationBy");
        this.References(x => x.Owner).Column("Owner");
        this.Table("Document");
    }

次のコードでテストしてみます

using (var transaction = Session.BeginTransaction())
        {
            var users = this.kernel.Get<IRepository<User>>();
            var document = this.kernel.Get<IRepository<Document>>();
            var user = new User { Login = "Blubb" };
            users.Add(user);
            var list = Builder<Document>.CreateListOfSize(50).All().With(x => x.Owner = user).Build().ToList();
            var list2 = Builder<Document>.CreateListOfSize(50).All().Build().ToList();
            list.ForEach(x => user.OwnedDocuments.Add(x));
            document.Add(list);
            document.Add(list2);
            transaction.Commit();
            var i = document.All().Count();
            i.Should().Be(50);
            var docs = ((IGuidKeyedRepository<User>)users).FindBy(user.Id).OwnedDocuments.Count();
            docs.Should().Be(50);
        }

最初の問題は、document.Add(list); を呼び出さないのにドキュメント カウントが常に 0 になるのはなぜですか? ユーザーのドキュメント コレクションにいくつかのドキュメントを追加すると、自動的にドキュメントに追加されると思いましたか? そして、なぜ最後のテストは 100 なのですか? ドキュメントをフィルタリングするため、そのユーザーに属します。

4

1 に答える 1

1

子コレクションにカスケード オプションを設定する必要があるようですOwnedDocuments

this.HasMany(x => x.OwnedDocuments).Inverse().Cascade.AllDeleteOrphan();

上記の設定では、コレクションに子を追加するとすべての子が保存され、コレクションからそれらを削除してオブジェクトを保存すると、それらの子オブジェクトが削除されます。これらの設定の詳細については、nhibernate のドキュメントを参照してください。

http://www.nhforge.org/doc/nh/en/

于 2012-09-02T15:20:14.773 に答える