2017-04-25 17 views
14

के बिना काम नहीं करेगा मैं एक प्लग बनाने की कोशिश कर रहा हूं जो उस ऐप के लिए ईएफ 6.1 और SQLite का उपयोग करेगा जहां मैं App.config को नहीं बदल सकता, इसलिए सभी कॉन्फ़िगरेशन और कनेक्शन स्ट्रिंग को कोड में सेट करने की आवश्यकता है।ईएफ 6, SQLite App.confg

मैं इस जवाब यह है कि होनहार Problems using Entity Framework 6 and SQLite

तो अब देखा पाया मैं इस तरह एक विन्यास वर्ग है:

public class CollectionDbConfiguration : DbConfiguration 
{ 
    public CollectionDbConfiguration() 
    { 
     SetProviderServices("System.Data.SQLite"(DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices))); 
     SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance); 
     SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);     
    } 
} 

मैंने पुष्टि की है इससे पहले कि संदर्भ पहली बार के लिए और सभी बनाई गई है इस हिट हो जाता है ये वापसी मूल्य।

मेरे संदर्भ इस

public class MyContext : DbContext 
{ 
    public MyContext(string connectionString) 
    : base(connectionString) { } 

    public DbSet<MyEntity> MyEntities { get; set; }  
} 

तरह लग रहा है और मैं कुछ कोड इस तरह यह बुला है:

var context = new MyContext("Data Source = mytest.db; Version = 3;"); 
var entities = context.MyEntities.ToList(); 

जब मैं कोशिश करते हैं और कोड यह संदर्भ की तरह दिखता है चलाने के कनेक्शन स्ट्रिंग संभालने है एसक्यूएल सर्वर के लिए है क्योंकि यह मुझे देता है:

कीवर्ड समर्थित नहीं है: 'संस्करण'।

अगर मैं इसे हटा देता हूं तो मुझे एक त्रुटि मिलती है जिसे वह कनेक्ट नहीं कर सकता है और इसकी स्पष्ट रूप से SQL सर्वर डेटाबेस से कनेक्ट करने का प्रयास कर रहा है।

public MyContext(DbConnection connection) 
    : base(connection, contextOwnsConnection: true) 
{ } 

और इस के साथ बुला:

मैं एक निर्माता जोड़कर एक SQLite सिलसिले में गुजर करने की कोशिश की

var context = new MyContext(new SQLiteConnection("Data Source = mytest.db; Version = 3;")); 
var entities = context.MyEntities.ToList(); 

लेकिन तब मैं त्रुटि मिलती है:

निर्धारण करने में असमर्थ 'System.Data.SQLite.SQLiteConnection' प्रकार के कनेक्शन के लिए DbProviderFactory प्रकार। सुनिश्चित करें कि ADO.NET प्रदाता अनुप्रयोग कॉन्फ़िगरेशन में स्थापित या पंजीकृत है।

तो मैं एक कारखाने समाधानकर्ता बना दिया है और पंजीकृत है कि

public class FactoryResolver : IDbProviderFactoryResolver 
{ 
    public DbProviderFactory ResolveProviderFactory(DbConnection connection) 
    { 
     if (connection.GetType() == typeof(SQLiteConnection)) 
     { 
      return SQLiteFactory.Instance; 
     } 

     if (connection.GetType() == typeof(EntityConnection)) 
     { 
      return SQLiteProviderFactory.Instance; 
     } 

     return null; 
    } 
} 

और कहा:

SetProviderFactoryResolver(new FactoryResolver()); 

लेकिन अब मैं इस मिल:

कोई इकाई की रूपरेखा प्रदाता ADO.NET के लिए मिला इनवेरिएंट नाम 'System.Data.SQLite.EF6' के साथ प्रदाता। सुनिश्चित करें कि प्रदाता अनुप्रयोग कॉन्फ़िगरेशन फ़ाइल के 'entityFramework' अनुभाग में पंजीकृत है। अधिक जानकारी के लिए http://go.microsoft.com/fwlink/?LinkId=260882 देखें।

मुझे दो दिनों के लिए इस पर बीट है और मैं विचारों से बाहर हूं।

public class SQLiteProviderInvariantName : IProviderInvariantName 
{ 
    public static readonly SQLiteProviderInvariantName Instance = new SQLiteProviderInvariantName(); 
    private SQLiteProviderInvariantName() { } 
    public const string ProviderName = "System.Data.SQLite.EF6"; 
    public string Name { get { return ProviderName; } } 
} 

class SQLiteDbDependencyResolver : IDbDependencyResolver 
{ 
    public object GetService(Type type, object key) 
    { 
     if (type == typeof(IProviderInvariantName)) return SQLiteProviderInvariantName.Instance; 
     if (type == typeof(DbProviderFactory)) return SQLiteProviderFactory.Instance; 
     return SQLiteProviderFactory.Instance.GetService(type); 
    } 

    public IEnumerable<object> GetServices(Type type, object key) 
    { 
     var service = GetService(type, key); 
     if (service != null) yield return service; 
    } 
} 

class SQLiteDbConfiguration : DbConfiguration 
{ 
    public SQLiteDbConfiguration() 
    { 
     AddDependencyResolver(new SQLiteDbDependencyResolver()); 
    } 
} 

अब इस काम करना चाहिए:

var context = new MyContext("Data Source = mytest.db; Version = 3;"); 
var entities = context.MyEntities.ToList(); 

अद्यतन: नेट 4 के लिए

उत्तर

13

न्यूनतम कनेक्शन स्ट्रिंग काम करने के साथ निर्माता बनाने के लिए आवश्यक एक कस्टम IProviderInvariantName, IDbDependencyResolver और DbConfiguration है। 0 आपको एक कस्टम IDbProviderFactoryResolver:

की भी आवश्यकता होगी

और SQLiteDbDependencyResolver.GetService विधि कार्यान्वयन के लिए

if (type == typeof(IDbProviderFactoryResolver)) return SQLiteDbProviderFactoryResolver.Instance; 

जोड़ें।

+0

मैंने यह कोशिश की लेकिन अब मुझे त्रुटि संदेश मिल गया है: 'System.Data.SQLite.SQLiteConnection' प्रकार के कनेक्शन के लिए DbProviderFactory प्रकार निर्धारित करने में असमर्थ। सुनिश्चित करें कि ADO.NET प्रदाता अनुप्रयोग कॉन्फ़िगरेशन में स्थापित या पंजीकृत है। – Mant101

+0

यह अजीब बात है क्योंकि मैं इस मुद्दे को ठीक तरह से डुप्लिकेट करने में सक्षम था जिस तरह से आपने इसका वर्णन किया था, और उसके बाद उपरोक्त इसे ठीक किया गया था। सुनिश्चित करें कि प्रोजेक्ट के अंदर कोई अन्य 'डीबी कॉन्फ़िगरेशन' कक्षाएं नहीं हैं (उदाहरण के लिए, जिसे आपने पोस्ट कोड में उपयोग किया था) और रिज़ॉलर्स - केवल उत्तर से कक्षाएं। और आप कनेक्शन स्ट्रिंग के साथ कन्स्ट्रक्टर का उपयोग करते हैं, कनेक्शन के साथ नहीं। जैसा कि आप देख सकते हैं, उपर्युक्त 'आईडीबीडीपेन्सीेंसी रीसोल्वर 'ब्रूट फोर्स' डीबीप्रोवाइडर फैक्ट्री 'को हल करता है, इसलिए ऐसी त्रुटि नहीं मिलनी चाहिए। –

+0

यदि आप पूर्ण रेपो प्रोजेक्ट प्रदान कर सकते हैं, तो मैं इसे देख सकता हूं, लेकिन मेरा मानना ​​है कि यह समाधान है, क्योंकि मैं SQL. डेटाबेस के साथ कनेक्ट/काम करने में सक्षम था, जिसमें स्पष्ट रूप से App.config से SQLite संबंधित प्रविष्टियों को टिप्पणी कर रहा था, और स्थानीय डीबी डिफॉल्ट को रखते हुए, एसक्यूएल सर्वर और माईएसQL –

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