使用F#和ASP.NET MVC保存EF

Jac*_*eja 5 f# entity-framework asp.net-mvc-4

基于丹尼尔莫尔及其着作的优秀样本.

我在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 }
Run Code Online (Sandbox Code Playgroud)

...........(更多代码)...........

在控制器中,我传递了所有必要的东西:

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()
Run Code Online (Sandbox Code Playgroud)

...........(更多代码)...........

现在,保存问题的方法在于如何使其成为可重用的.如果我传递DbSet,我需要一种方法来调用上下文,我不知道如何从特定的DbSet中找到它(怀疑它甚至是可能的).

如果我同时传递DbContext和DbSet,我就不能做类似的事情了

use nameOfDbContext
    nameOfDbContext.NameOfDbSet.Add entity
Run Code Online (Sandbox Code Playgroud)

我发现硬编码任何东西的唯一选择,但这似乎不对.

这是一个遗憾,但丹尼尔的伟大例子不是以"传统"EF方式进行保存部分并使用总线等,这很棒,但我首先希望基本应用程序完全正常工作,然后从那里改进Async控制器,邮箱等

任何暗示都将非常感激.干杯!

Dan*_*eny 1

为什么不能同时传递DbContextDbSet,并使用DbContext进行保存,并直接访问DbSet(不要尝试通过DbContext)进行查询等?

如果您有类型,您也可以DbSet从 a获取 a,这也可能有帮助:DbContext

myDbContext.Set<'a>()
Run Code Online (Sandbox Code Playgroud)