5

基于Daniel Mohl 和他的书中的优秀样本。

我有 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 }

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

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

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

我发现硬编码任何东西的唯一选择,但这似乎并不正确。

很遗憾,但 Daniel 的优秀示例并没有以“传统”EF 方式进行节省部分并使用总线等,这很好,但我首先希望有一个基本应用程序完全工作,然后从那里使用 Async 进行改进控制器、邮箱等

任何提示将不胜感激。干杯!

4

1 回答 1

1

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

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

myDbContext.Set<'a>()
于 2013-10-27T15:58:21.147 回答