2013-03-04 32 views
5

基于来自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方式的节省部分,并使用巴士等,这是伟大的,但我首先想有一个基本的应用程序充分工作,然后改善从那里与异步控制器,邮箱等

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

回答

1

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

您也可以从一个DbContextDbSet如果你有型,这也可能有助于:

myDbContext.Set<'a>() 
+0

您好丹尼!自从我发布他的文章已经很长时间了,我终于采取了完全不同的路线,但我会尽力检查它,因为它肯定会对其他项目有价值。非常感谢! – 2013-10-31 09:44:25