2013-03-04 13 views
5

Sulla base dei grandi campioni da Daniel Mohl and his book.Risparmio EF con F # e ASP.NET MVC

Ho e applicazione ASP.NET MVC in F # con il modello online per esso. Finora ho il mio modello, entità, controller, repository, vista ... tutto molto generalizzato e riutilizzabile, e l'interrogazione è grande. Ma non riesco a trovare un modo per mantenere ugualmente riutilizzabile il salvataggio sulla parte DbContext.

Per la parte di query il codice per Repository.fs è la seguente

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 } 

........... (più codice) ......... ..

E nel controller mi passa tutto il necessario:

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() 

........... (più codice) ...........

Ora, quando si salva il problema si trova in come renderlo riutilizzabile come quello. Se passo il DbSet ho bisogno di un modo per chiamare il contesto, che non so come trovarlo dallo specifico DbSet (dubito che sia persino possibile).

Se mi passa sia la DbContext e DbSet, non posso fare qualcosa di simile

use nameOfDbContext 
    nameOfDbContext.NameOfDbSet.Add entity 

L'unica opzione che trovo a hardcode nulla, ma che proprio non mi sembra giusto.

È un peccato, ma i grandiosi esempi di Daniel non fanno la parte di risparmio in un modo "tradizionale" EF e usano bus, ecc., Il che è ottimo ma prima vorrei avere un'applicazione di base pienamente funzionante, e quindi migliorare da lì con controller Async, caselle di posta, ecc.

Qualsiasi suggerimento sarebbe molto apprezzato. Saluti!

risposta

1

Perché non si può passare sia il DbContext e DbSet, e utilizzare il DbContext per il salvataggio, e accedere alla DbSet direttamente (non cercare di passare attraverso DbContext) per le query, ecc?

È possibile anche ottenere una DbSet da un DbContext se avete il tipo, che potrebbe anche aiutare:

myDbContext.Set<'a>() 
+0

Ciao Danny! È passato molto tempo da quando ho pubblicato la sua e alla fine ho preso una strada completamente diversa, ma cercherò di dare un'occhiata perché di sicuro sarà preziosa per altri progetti. Molte grazie! –