1

私は「NHibernateプロジェクトを知る」を構築中です。

私の単体テスト (nunit) は、リポジトリ レイヤーに通常の mvc サイトと同じ構成を提供しますが、「MsSqlConfiguration.MsSql2008」の代わりに「SQLiteConfiguration.Standard.InMemory()」を使用します。私の希望は、流暢な nhibernate と自動マッピングをまったく同じ方法で使用できるようにすることですが、テスト用のクイック イン メモリ データベースとアプリ用の実際のデータベースを用意することです。

リポジトリ コンストラクターでは、すべてのクエリが使用する Session オブジェクトを作成し、セッションが正しく処理されるようにする IDisposable も実装します。たとえば、記事の保存メソッドは次のようになります。

    public void SaveArticle(Article article)
    {            
        Session.SaveOrUpdate(article);      
        Session.Flush();
    }

これまでのところ、MVC サイトはすべて正しく機能しているようで、私のテストはパスしています。私のデザインに問題があるに違いない問題に遭遇したと思います。

これまでのところ、2 つのオブジェクトがあります。

class Article
{
    public virtual int Id {get; set; }
    public virtual IList<Tag> Tags {get; set; }
 }

 class Tag
 {
    public virtual int Id {get; set; }
    public virtual string Text {get; set; }
 }

DB に各タグのインスタンスを 1 つだけ格納したい。非常に多くの記事で同じタグを使用できます。だから私はこのテストを書いた:

    [Test]
    public void TestDeletingTagWillNotDeleteOthersTagV2()
    {
        Article article = new Article();
        article.Tags.Add(new Tag { Text = "C#" });
        article.Tags.Add(new Tag { Text = "VB" });
        Service.SaveArticle(article);

        Article article2 = new Article();
        article2.Tags.Add(new Tag { Text = "C#" });
        Service.SaveArticle(article2);

        Guid article1Id = article.Id;
        Guid article2Id = article2.Id;

        article = null;
        article2 = null;

        Article article3 = Service.GetArticle(article1Id);
        Article article4 = Service.GetArticle(article2Id);

        Assert.AreEqual(2, article3.Tags.Count);
        Assert.AreEqual(1, article4.Tags.Count);

        Assert.AreEqual(2, Service.Tags.Count);

        article3.Tags.RemoveAt(0);
        Service.SaveArticle(article3);

        Article article5 = Service.GetArticle(article1Id);
        Article article6 = Service.GetArticle(article2Id);

        Assert.AreEqual(1, article5.Tags.Count);
        Assert.AreEqual(1, article6.Tags.Count);

        Assert.AreEqual(2, Service.Tags.Count);
    }

このテストはパスしますが、失敗するはずです。(MVC サイトを実行すると表示されます。つまり、最初の記事には「C#」や「VB」ではなく「VB」というタグが 1 つしかありません。

セッションがまだ開いているため、nhibernate はまだすべてを保持しており、何があったかを覚えているためだと思います。

私の主な質問は、メモリ内データベースでこれをテストするにはどうすればよいですか? 共有タグを保存して削除した後も、記事に本来あるべきものが残っていることを確認するにはどうすればよいですか?

作成されたテーブル構造は次のとおりです (これは間違っていると思いますが、リンク テーブルが必要です)。

Article:
    Id (PK, uniqueid, not null)
     ...........

 Tag
    Id (PK, uniqueid, not null)
    Text (nvarchar, null)
    Article_id (FK, uniqueid, null)

流れるような自動マッピングを使用してリンク テーブルをセットアップし、1 つのタグを複数の記事で共有し、1 つの記事に多くのタグを含める方法がわからない

タグと記事にリンク テーブルがあることを確認する方法を見つけたと思います。

        configuration.Mappings(m => m.AutoMappings.Add((AutoMap.AssemblyOf<Article>())
                            .Override<Article>(map => map.IgnoreProperty(x => x.IsPublished))
                            .Override<Article>(map => map.HasManyToMany(a => a.Tags).Cascade.All())
                            .Conventions.Add(DefaultCascade.All()))
4

1 に答える 1