2013-02-04 14 views
9

मैं पहले पोस्टग्रेएसक्यूएल (एनजीपीएसक्यूएल प्रदाता) के साथ काम कर रहा ईएफ 5.0 कोड प्राप्त करने की कोशिश कर रहा हूं। मेरे पास NuGet के माध्यम से Npgsql 2.0.12.1 स्थापित है (संदर्भित असेंबली 2.0.12.0 हालांकि) है।इकाई फ्रेमवर्क 5.0 पोस्टग्रेएसक्यूएल (एनजीपीएसक्यूएल) डिफ़ॉल्ट कनेक्शन फैक्टरी

<entityFramework> 
    <defaultConnectionFactory type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7" /> 
</entityFramework> 
<system.data> 
     <DbProviderFactories> 
      <add name="Npgsql Data Provider" 
       invariant="Npgsql" 
       description="Data Provider for PostgreSQL" 
       support="FF" 
       type="Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7"/> 
     </DbProviderFactories> 
</system.data> 

मैं निम्नलिखित है परीक्षण सफलतापूर्वक चल रहा है: मैं Npgsql app.config में घोषित (दोनों डिफ़ॉल्ट कनेक्शन कारखाने और प्रदाता कारखाना) है

[Test] 
public void DatabaseConnection_DatabaseFactoryTest() 
{ 
    var factory = DbProviderFactories.GetFactory("Npgsql"); 
    var conn = factory.CreateConnection(); 
    conn.ConnectionString = _connectionString; 
    var npg = (NpgsqlConnection)conn; 
    var result = TestConnectionHelper(npg); // scalar select version(), nothing particular 
    Assert.AreEqual(result, "PostgreSQL 9.2.2, compiled by Visual C++ build 1600, 64-bit");    
} 

इसका मतलब है कि कम से कम डेटाबेस उदाहरण चल रहा है और प्रदाता है सफलतापूर्वक कॉन्फ़िगर किया गया है।

public class InventoryContext : DbContext 
{ 
    public InventoryContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
    } 
    // mappings and properties, cut for conciseness 
} 

के बाद परीक्षण में विफल रहता है:

[Test] 
public void DatabaseConnection_DatabaseContextTest() 
{ 
    using (var ctx = new InventoryContext(_connectionString)) 
    { 
     //var db = ctx.Database; 
     ctx.InventoryObjects.Add(_inventoryObject); // exception here 
     ctx.SaveChanges(); 
    } 
} 

इसे कहते हैं

अब क्या मैं चाहता हूँ कस्टम डेटाबेस संदर्भ DbContext से विरासत में मिली एक ही प्रदाता से संबद्ध रहेगा जो और प्रारंभ कनेक्शन स्ट्रिंग के माध्यम से उपयोग करने के लिए है
Failed to set Database.DefaultConnectionFactory to an instance of the 'Npgsql.NpgsqlFactory, Npgsql, Version=2.0.12.0, Culture=neutral, PublicKeyToken=5d8b90d52f46fda7' type as specified in the application configuration. See inner exception for details. 

आंतरिक अपवाद अमान्यऑपरेशन अपवाद है:

{"Constructor for type \"Npgsql.NpgsqlFactory\" is not found."} 

मुझे लगता है कि वहाँ कनेक्शन स्ट्रिंग के साथ एक समस्या है (यह Npgsql प्रदाता शामिल नहीं है):

"Server=127.0.0.1;Port=5432;User Id=postgres;Password=p4ssw0rd;Database=InventoryDatabase;"; 

इस समस्या को हल करने के लिए प्रोग्राम के रूप में सबसे खूबसूरत तरीका क्या है? बस कनेक्शन को पार करने का प्रयास करें app.config से संदर्भ के कन्स्ट्रक्टर तक, यह काम करता है।
संपादित
ड्रॉपबॉक्स पर अपलोड किया गया परीक्षण परियोजना - VS2012 solution, 10 mb

+0

हाय! यह अंतिम .1 nuget पैकेज में है क्योंकि मैं 2.0.12 पैकेज अद्यतन नहीं कर सका। पैकेज में एक लापता फाइल थी और मुझे इसे अपडेट करना पड़ा। लेकिन बाकी आश्वासन दिया कि Npgsql बाइनरी 2.0.12 संस्करण के समान है। :) क्या आप मुझे यह नमूना प्रोजेक्ट भेजना चाहते हैं ताकि मैं इसे देख सकूं? मुझे लगता है कि यह एनजीपीएसक्ल में एक बग हो सकता है जो एक कन्स्ट्रक्टर ईएफ की उम्मीद कर रहा है। मेरा ईमेल npgsql dor संगठन पर francisco है। अग्रिम में धन्यवाद। –

+0

संस्करण कोई समस्या नहीं है हालांकि मुझे कुछ समय पता चला है कि रनटाइम के दौरान असेंबली क्यों नहीं मिली थी। बिंदु वास्तव में कनेक्शन स्ट्रिंग कॉन्फ़िगरेशन में है, खासकर मेरे उत्पादन वातावरण में तथ्य में मैं .config फ़ाइलों का उपयोग/संशोधित नहीं कर सकता (आईआईएस सीमाओं में प्रकाशित WPF XBAP एप्लिकेशन)। आपको कुछ घंटों में नमूना परियोजना भेज देगा। – Jaded

+0

भेजे गए नमूना प्रोजेक्ट, अगर कोई और देखना चाहता है तो ड्रॉपबॉक्स डाउनलोड लिंक जोड़ा गया। – Jaded

उत्तर

7

समस्या में गहरी खुदाई, पता चला कि यह है कि तथ्य यह है कि Npgsql संदर्भित कर रहा है EntityFramework 4.4.0 विधानसभा के कारण होता है। निम्नानुसार हल किया गया:

  1. प्रोजेक्ट का परीक्षण करने के लिए ईएफ नुजेट पैकेज जोड़ा गया (जो एफडब्लू 4.5 के खिलाफ बनाया गया है);
  2. Npgsql2010 प्रोजेक्ट में EntityFramework.dll संस्करण 5 में मैन्युअल रूप से संदर्भ जोड़ा गया (Nuget डिफ़ॉल्ट रूप से 4.4.0 जोड़ता है);
  3. विधानसभा को Npgsql app.config में बाध्यकारी परिवर्तित "EntityFramework, संस्करण = 5.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089";
  4. Npgsql.NpgsqlFactory "प्रकार के लिए निर्माता" ऊपर वर्णित तय "निर्माता को सार्वजनिक बनाने का त्रुटि नहीं मिला है,
  5. फिक्स्ड निम्न त्रुटि " असमर्थ डाली NpgsqlFactory IDbConnectionFactory करने के लिए " IDbConnectionFactory इंटरफेस को लागू करने से NpgsqlFactory पर:

    System.Data.Entity.Infrastructure का उपयोग कर;
    ...
    सार्वजनिक सील वर्ग NpgsqlFactory: DbProviderFactory, IServiceProvider, IDbConnectionFactory
    ...
    सार्वजनिक DbConnection CreateConnection (स्ट्रिंग nameOrConnectionString)
    {
    वापसी नई NpgsqlConnection (nameOrConnectionString);
    }

अब मैं हो रही हैं, "त्रुटि: 3F000: स्कीमा" dbo "मौजूद नहीं है" जो एफई से संबंधित है। मैं डीबीकॉन्टेक्स्ट के ऑनमोडेल क्रिएटिंग में पोस्टग्रेएसक्यूएल मानक सार्वजनिक स्कीमा पर मैपिंग कर रहा हूं: मॉडलबिल्डर। एंटीटी()। टोटेबल ("टेबलनाम", "पब्लिक") हालांकि। इस समस्या के समाधान के लिए तत्पर हैं।

+0

बढ़िया! मैं तुरंत लापता टुकड़े टुकड़े जोड़ दूंगा: कन्स्ट्रक्टर दृश्यता और इंटरफ़ेस कार्यान्वयन। इसे जांचने के लिए धन्यवाद। –

+1

मुझे लगता है कि मैं बहुत तेजी से कूद गया। Msdn प्रलेखन की जांच करते समय, मैंने देखा कि SqlClientFactory एक चीज है और SqlConnectionFactory एक और है। NpgsqlFactory SqlClientFactory के बराबर है। इस समस्या को पूरा करने के लिए, हमें NpgsqlConnectionFactory नामक एक और कक्षा बनाने की आवश्यकता है जो इकाई फ्रेमवर्क समर्थन से जुड़ा होगा। उसके लिए खेद है। मैं जांचूंगा कि हम यह कैसे करेंगे। –

+0

मैंने PostgreSQL और Npgsql के साथ EntityFramework का उपयोग करने पर छोड़ दिया है इन मुद्दों को ठीक किया गया है। जब तक यह अधिक स्थिर न हो जाए तब तक मैं इसके साथ उत्पादन में नहीं जा रहा हूं। – Jammer

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