2013-03-04 10 views
5

Na podstawie wspaniałych próbek z Daniel Mohl and his book.EF oszczędności z F # i ASP.NET MVC

Mam i aplikacji ASP.NET MVC w F # z szablonu online dla niego. Do tej pory mam swój model, encje, kontroler, repozytorium, widok ... bardzo ogólny i wielokrotnego użytku, a zapytania są świetne. Ale nie mogę znaleźć sposobu, aby zachować zapisywanie do części DbContext, tak samo jak w przypadku wielokrotnego użytku.

Dla części odpytywanie kodu dla Repository.fs następująco

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 } 

........... (dodatkowy kod) ......... ..

iw sterowniku przekazać wszystko, co niezbędne:

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

........... (więcej Code) ...........

Teraz, kiedy zapisywanie problemu polega na tym, jak sprawić, by był on do ponownego użycia. Jeśli przekażę DbSet, potrzebuję sposobu na wywołanie kontekstu, którego nie znam, jak znaleźć go z określonego DbSet (wątpliwość jest nawet możliwa).

Gdybym przechodzić zarówno DbContext i DbSet, mogę nie jedyna opcja uważam hardcode cokolwiek zrobić coś

use nameOfDbContext 
    nameOfDbContext.NameOfDbSet.Add entity 

, ale to po prostu nie wydaje się słuszne.

To wstyd, ale wspaniałe przykłady Daniela nie robią części oszczędzającej w "tradycyjnym" efekcie EF i używają autobusów itp., Co jest wspaniałe, ale najpierw chciałbym, aby podstawowa aplikacja w pełni działała, a następnie poprawiła się stamtąd ze sterownikami Async, skrzynkami pocztowymi itp.

Każda wskazówka byłaby bardzo doceniana. Twoje zdrowie!

Odpowiedz

1

Dlaczego nie można przekazać zarówno DbContext i DbSet i użyć DbContext do zapisywania i uzyskiwania dostępu do DbSet bezpośrednio (nie spróbować przejść przez DbContext) dla zapytań itp?

Można również uzyskać DbSet od A DbContext jeśli masz typ, który może również pomóc:

myDbContext.Set<'a>() 
+0

Witaj Danny! Minęło dużo czasu, odkąd opublikowałem jego i ostatecznie podjąłem zupełnie inną trasę, ale spróbuję to sprawdzić, ponieważ na pewno będzie to cenne dla innych projektów. Wielkie dzięki! –