2013-03-04 3 views
5

На основе отличных образцов от Daniel Mohl and his book.Сохранение EF с помощью F # и ASP.NET MVC

У меня есть приложение ASP.NET MVC в F # с онлайн-шаблоном для него. Пока у меня есть моя модель, сущности, контроллер, репозиторий, просмотр ... все очень обобщенные и многоразовые, и запрос очень велик. Но я не могу найти способ сохранить сохранение части 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 } 

........... (More кода) ......... ..

И в контроллере я прохожу все необходимое:

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

........... (More код) ...........

Теперь при сохранении проблемы возникает вопрос о том, как сделать ее пригодной для повторного использования. Если я передаю DbSet, мне нужен способ вызвать контекст, который я не знаю, как найти его из конкретного DbSet (сомневаюсь, что это даже возможно).

Если я прохожу как DbContext и DbSet, я не могу сделать что-то вроде

use nameOfDbContext 
    nameOfDbContext.NameOfDbSet.Add entity 

Единственный вариант я считаю Кодирую ничего, но это просто не кажется правильным.

Это позор, но великие примеры Даниэля не делают экономичную часть в «традиционном» способе EF и используют автобусы и т. Д., Что отлично, но я сначала хотел бы, чтобы основное приложение полностью работало, а затем улучшало оттуда с контроллерами Async, почтовыми ящиками и т. д.

Подсказка была бы принята с благодарностью. Ура!

ответ

1

Почему вы не можете пройти как DbContext и DbSet и использовать DbContext для сохранения и доступа к DbSet напрямую (не пытайтесь пройти через DbContext) для запросов и т.д.?

Вы также можете получить DbSet от DbContext, если у вас есть тип, который может также помочь:

myDbContext.Set<'a>() 
+0

Привет Дэнни! Прошло много времени с тех пор, как я опубликовал его, и я, наконец, занял совершенно другой маршрут, но я попытаюсь проверить его, поскольку он наверняка будет полезен для других проектов. Большое спасибо! –

Смежные вопросы