2013-03-04 13 views
5

के साथ ईएफ बचत Daniel Mohl and his book के महान नमूने के आधार पर।एफ # और एएसपी.नेट एमवीसी

मेरे पास ऑनलाइन टेम्पलेट के साथ एफ # में एएसपी.नेट एमवीसी एप्लीकेशन है। अब तक मेरे पास मॉडल, संस्थाएं, नियंत्रक, भंडार, दृश्य है ... सभी बहुत सामान्यीकृत और पुन: प्रयोज्य, और पूछताछ बहुत बढ़िया है। लेकिन मुझे बचत को डीबीकॉन्टेक्स्ट भाग को समान रूप से पुन: प्रयोज्य रखने के लिए कोई रास्ता नहीं मिल रहा है। के रूप में

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 } 

........... (अधिक कोड) इस प्रकार

क्वेरी भाग के लिए Repository.fs के लिए कोड है .........

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

........... (अधिक संहिता) ...........

: ..

और नियंत्रक में मैं सब कुछ आवश्यक पारित

अब, समस्या को सहेजते समय यह पुन: प्रयोज्य बनाने के तरीके में रहता है। अगर मैं डीबीसेट पास करता हूं तो मुझे संदर्भ को कॉल करने का एक तरीका चाहिए, जिसे मैं नहीं जानता कि इसे विशिष्ट डीबीसेट से कैसे ढूंढें (संदेह यह भी संभव है)।

अगर मैं दोनों DbContext और DbSet गुजरती हैं, मैं की तरह

use nameOfDbContext 
    nameOfDbContext.NameOfDbSet.Add entity 

कुछ कर सकते हैं नहीं मैं कुछ भी हार्डकोड करने लगता है ही एकमात्र विकल्प है, लेकिन यह सिर्फ सही नहीं लगता है।

यह शर्म की बात है लेकिन डैनियल के महान उदाहरण "पारंपरिक" ईएफ तरीके से बचत भाग नहीं करते हैं और बसों का उपयोग करते हैं, जो कि बहुत अच्छा है लेकिन मैं पहले मूलभूत आवेदन पूरी तरह से काम करना चाहता हूं, और फिर बेहतर करना चाहता हूं वहां से Async नियंत्रक, मेलबॉक्स, आदि

किसी भी संकेत की सराहना की जाएगी। चीयर्स!

उत्तर

1

तुम क्यों पारित नहीं हो सकता दोनों DbContext और DbSet, और बचाने के लिए DbContext उपयोग करें, और सीधे DbSet का उपयोग (कोशिश करते हैं और DbContext के माध्यम से जाना नहीं है) प्रश्नों आदि के लिए?

myDbContext.Set<'a>() 
+0

हैलो डैनी:

यदि आप प्रकार है, जो भी मदद कर सकता है है, तो आप भी एक DbContext से एक DbSet प्राप्त कर सकते हैं! जब से मैंने उसे पोस्ट किया है, तब से यह काफी समय हो गया है और मैंने अंत में एक पूरी तरह से अलग रास्ता लिया है, लेकिन मैं इसे जांचने की कोशिश करूंगा क्योंकि यह निश्चित रूप से अन्य परियोजनाओं के लिए मूल्यवान होगा। आपका बहुत बहुत धन्यवाद! –

संबंधित मुद्दे