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控制器,邮箱等
任何暗示都将非常感激.干杯!
为什么不能同时传递DbContext和DbSet,并使用DbContext进行保存,并直接访问DbSet(不要尝试通过DbContext)进行查询等?
如果您有类型,您也可以DbSet从 a获取 a,这也可能有帮助:DbContext
myDbContext.Set<'a>()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
711 次 |
| 最近记录: |