基于来自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方式的节省部分,并使用巴士等,这是伟大的,但我首先想有一个基本的应用程序充分工作,然后改善从那里与异步控制器,邮箱等
任何提示将不胜感激。干杯!
您好丹尼!自从我发布他的文章已经很长时间了,我终于采取了完全不同的路线,但我会尽力检查它,因为它肯定会对其他项目有价值。非常感谢! – 2013-10-31 09:44:25