7

私はmongodbが初めてで、新しいプロジェクトのmvc4 Webアプリケーションに取り組んでいます。

データベース レベルの通信に mongodb コンテキストと対話するリポジトリ パターンを使用したいと考えています。

Entity Framework 4.0 で使用した単純なインターフェイスは次のとおりです。検索メンバーは、私にとって問題のある領域です。mongodb コンテキストでそれらを処理する方法がわかりません。

public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Remove(T entity);
    IQueryable<T> Find(Expression<Func<T, bool>> predicate);
    //IQueryable<T> FindAll();

}

私は、accessId と呼ばれるメンバーを提供する ImongoEntity からの Hero と呼ばれる非常に単純なモデルを持っています。

public class Hero : MongoDB.Kennedy.IMongoEntity
{
    public ObjectId _id { get; set; }
    public string Name { get; set; }
    public string Alias { get; set; }
    public string _accessId { get; set;}
}

Context クラスは非常に単純で、IQueryable プロパティとして公開されたヒーローのコレクションを見ることができます。

public class MongoDataConetext: MongoDB.Kennedy.ConcurrentDataContext
{
    public MongoDataConetext(string databaseName, string serverName="localhost") : base(databaseName, serverName)
    {
    }

    public IQueryable<Hero> Heros {
        get {
            return base.GetCollection<Hero>().AsQueryable();
        }
    }
}

現在、私のリポジトリでは、最も単純なメソッドは追加と削除であり、mongodb コンテキストと正常に通信し、mongodb から追加または削除されたエンティティを取得します。ただし、メソッドを見つけると、コンパイラ レベルのエラーが発生します。find および find all メソッドのヘルプが必要です。ヒーロー、ソリューション、プロジェクト、ユーザー、カテゴリなどのエンティティのリポジトリ クラスが必要なため、ジェネリックを使用しています。

public class Repository<T> : IRepository<T> where T : class, IMongoEntity
{
    private readonly MongoDataConetext _ctx;
    public Repository(MongoDataConetext ctx)
    {
        _ctx = ctx;
    }
    public void Add(T entity)
    {
        _ctx.Save(entity);


    }

    public void Remove(T entity)
    {
        _ctx.Delete(entity);
    }

    public IQueryable<T> Find(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
    {
        _ctx.Heros.Where(predicate);
        //throw new NotImplementedException();
    }

    //public IQueryable<T> FindAll()
    //{
    //    throw new NotImplementedException();
    //}
}
4

4 に答える 4

4

コレクションに対して LINQ を使用しようとしているようです。それは最高です。メソッドを記述するのではなく、IQueryable プロパティを公開するだけで、これをはるかに簡単に行うことができますFind()

上記のサンプルの例を次に示します。

public class HeroRepository : IRepository<Heros> where T : class, IMongoEntity
{
    // ...

    public IQueryable<Heros> Heros 
    {
        get 
        { 
            return _ctx.GetCollection<Heros>().AsQueryable(); 
            // Careful there, doing this from memory, may be a little off...
        }
    }
}

もちろん、このクラスを使用するときは、次のようにします。

var r = new HeroRepository();
var heros = r.Heros.Where(r => r.SuperPowerLevel > 20);
于 2013-06-19T14:43:33.197 に答える
0

かなり古い投稿であることは承知していますが、 Githubに実装されている MongoRepository プロジェクトを共有するか、 NuGet パッケージとしてダウンロードしたいと思います。

注: MongoDB リポジトリを実装しようとしたときに発生した問題の 1 つは、MongoDB ドライバーのバージョンに応じて動作が異なるか、.NET Framework と多かれ少なかれ同じであることです。MongoRepository プロジェクト (上記のリンク) は、異なるバージョンの MongoDB ドライバーを使用する .net 3.5、4.0、および 4.5 フレームワークの異なるコード バージョンでこの問題を解決しました ( MongoDB ドライバーの互換性を確認してください)。

于 2015-06-30T10:48:58.780 に答える