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

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

我发现唯一的选项是硬编码任何内容,但这似乎不太合适。

很遗憾,但丹尼尔的优秀示例并没有以“传统”的EF方式进行保存,并使用总线等,这非常好,但我首先希望拥有一个完全工作的基本应用程序,然后再通过异步控制器、邮箱等进行改进。

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

1个回答

1
为什么不能同时传递DbContext和DbSet,使用DbContext进行保存,并直接访问DbSet(不要尝试通过DbContext)进行查询等操作?
如果有类型,您还可以从DbContext获取DbSet,这也可能有所帮助。
myDbContext.Set<'a>()

你好 Danny!自从我上次发布以来已经很长时间了,我最终采取了完全不同的路线,但我会尝试检查它,因为它肯定对其他项目有价值。非常感谢! - Jacobo Polavieja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接