2013-03-04 7 views
5

Daniel Mohl and his bookの偉大なサンプルに基づいています。F#とASP.NET MVCでのEFセーブ

私は、F#のASP.NET MVCアプリケーションとそのためのオンラインテンプレートを持っています。これまで私はモデル、エンティティ、コントローラ、リポジトリ、ビューを持っていました...非常に一般化され、再利用可能であり、クエリは素晴らしいです。しかし、私はDbContext部分への保存を同じように再利用できるようにする方法を見つけることはできません。

namespace Melopienso.Repositories 

open System 
open System.Linq 

module Repository = 
    let get (source:IQueryable<_>) queryFn = 
     queryFn source |> Seq.toList 

    let getAll() = 
     fun s -> query { for x in s do 
         select x } 

    let find filterPredFn = 
     filterPredFn 
     |> fun fn s -> query { for x in s do 
           where (fn()) } 

    let getTop rowCount = 
     rowCount 
     |> fun cnt s -> query { for x in s do 
           take cnt } 

...........(詳細コード)を次のようにクエリの一部についてRepository.fsためのコードである......... ..

そして、私は必要なすべてのものを渡しコントローラで:

namespace Melopienso.Controllers 

open System 
open System.Web.Mvc 
open Melopienso.Models 
open Melopienso.Repositories 
open Repository 
open Utils 

[<HandleError>] 
type CategoriesController(context:IDisposable, ?repository) = 
    inherit Controller() 

let fromRepository = 
    match repository with 
    | Some v -> v 
    | _ -> (context :?> MelopiensoEntities).Categories 
    |> Repository.get 

new() = new CategoriesController(new MelopiensoEntities()) 

member this.Index() = 
    getAll() |> fromRepository |> this.View 

override x.Dispose disposing = 
    context.Dispose() 
    base.Dispose disposing 

[<HttpGet>] 
member this.Create() = 
    this.View() 

...........(詳細コード)...........

今、問題を保存すると、それを再使用可能にする方法があります。私がDbSetを渡す場合、コンテキストを呼び出す方法が必要ですが、特定のDbSetからそのコンテキストを見つける方法がわかりません(疑問もあります)。

私はDbContextとDbSetの両方に合格した場合、私は

use nameOfDbContext 
    nameOfDbContext.NameOfDbSet.Add entity 

私は何をハードコーディングするために見つけるが、それはちょうどいないようだ唯一のオプションのような何かを行うことはできません。

ダニエルの偉大な例は、 "伝統的な" EFの方法で節約を行い、バスなどを使うことはありませんが、まず基本的なアプリケーションを十分に動作させてから改善したいと思いますそこから非同期コントローラ、メールボックスなど

すべてのヒントをいただければ幸いです。乾杯!

答えて

1

は、なぜあなたはDbContextDbSetの両方に合格し、保存するためDbContextを使用して、クエリなどのために(DbContext通過しようとして行っていない)に直接DbSetにアクセスすることはできませんか?

あなたにも役立つかもしれないタイプ、持っている場合もDbContextからDbSetを取得することができます。

myDbContext.Set<'a>() 
+0

こんにちはダニーを!私が彼を投稿してからはずっと時間がかかっていて、まったく別のルートをとったのですが、他のプロジェクトにも役立つと確信しています。どうもありがとう! –

関連する問題