2013-03-04 65 views
5

基於來自Daniel Mohl and his book的大樣本。EF用F#和ASP.NET MVC保存

我有和F#中的ASP.NET MVC應用程序和它的在線模板。到目前爲止,我有我的模型,實體,控制器,存儲庫,視圖...都是非常普遍和可重用的,而且查詢非常好。但我找不到一種方法來保存DbContext的部分同樣可重用。

對於所述查詢一部分Repository.fs的代碼如下

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 } 

...........(多個碼)......... ..

和Controller我通過一切必要的:

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保存,並直接訪問DbSet(不要試圖去通過DbContext)進行查詢等?

您也可以從一個DbContextDbSet如果你有型,這也可能有助於:

myDbContext.Set<'a>() 
+0

您好丹尼!自從我發佈他的文章已經很長時間了,我終於採取了完全不同的路線,但我會盡力檢查它,因爲它肯定會對其他項目有價值。非常感謝! – 2013-10-31 09:44:25