2016-07-24 5 views
16

के साथ System.Data.SQLite का उपयोग करके सरल उदाहरण। मैं SQLite और EF6 का उपयोग कर कंसोल ऐप में काम करने के लिए एक सरल कोड प्राप्त करने का प्रयास कर रहा हूं, हालांकि मैं कई त्रुटियों में चल रहा हूं: मैंने एक नया कंसोल बनाया वीएस 2015 में परियोजना। फिर NuGet के माध्यम से ईएफ (6.1.3) और System.Data.SQLite (1.0.102) स्थापित करें।एंटिटी फ्रेमवर्क 6

namespace SQLiteConsole1 
{ 
    class Person 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 

    class MyContext : DbContext 
    { 
     public DbSet<Person> Persons { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var db = new MyContext()) 
      { 
       var person = new Person() { Name = "John" }; 
       db.Persons.Add(person); 
       db.SaveChanges(); 
      } 
     } 
    } 
} 

यह मेरी app.config इस तरह दिखता है क्या है:

कोशिश एक सरल कार्यक्रम चलाने के लिए

<connectionStrings> 
    <add name="MyContext" connectionString="Data Source=C:\Temp\Test.sqlite" providerName="System.Data.SQLite" /> 
    </connectionStrings> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
     <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" /> 
    </providers> 
    </entityFramework> 
    <system.data> 
    <DbProviderFactories> 
     <remove invariant="System.Data.SQLite.EF6" /> 
     <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" /> 
    <remove invariant="System.Data.SQLite" /><add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /></DbProviderFactories> 
    </system.data> 

जब मैं पहली बार इस कार्यक्रम मैं निम्नलिखित त्रुटि मिलती है चलाएँ:

"अनचाहे अपवाद: System.InvalidOperationException: एडीओ.NET प्रदाता के लिए inventt name 'System.Data.SQLite' के साथ कोई इकाई फ्रेमवर्क प्रदाता नहीं मिला। सुनिश्चित करें कि प्रदाता पंजीकृत है एप्लिकेशन कॉन्फ़िगरेशन फ़ाइल का 'entityFramework' अनुभाग। "

तो मैं <provider invariantName="System.Data.SQLite.EF6"<provider invariantName="System.Data.SQLite" को बदलने के लिए, तो मैं इस त्रुटि मिलती है:

Unhandled Exception: System.Data.Entity.Infrastructure.DbUpdateException: An error occurred while updating the entries. See the inner exception for details. System.Data.Entity.Core.UpdateException: An error occurred while updating the entries. See the inner exception for details. System.Data.SQLite.SQLiteException: SQL logic error or missing database no such table: People

क्या इस सरल काम कर उदाहरण प्राप्त करने के लिए परिवर्तित करने की जरूरत है?

उत्तर

19

ऐसा ही एक सवाल यहाँ पर पूछा जाता है: Entity Framework 6 with SQLite 3 Code First - Won't create tables

kjbartel बहुत उपयोगी व्याख्या यह है कि तालिका बनाने एफई SQLite ड्राइवर द्वारा समर्थित नहीं है देता है।

यह भी देखें https://github.com/msallin/SQLiteCodeFirst, जो एक उत्कृष्ट समाधान प्रदान करता है। मैं SQLite.CodeFirst NuGet पैकेज स्थापित किया है, और नीचे दिए गए कोड जोड़ा, फिर ऐप्स ठीक काम करता है:

class MyContext : DbContext 
    { 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists<MyContext>(modelBuilder); 
      Database.SetInitializer(sqliteConnectionInitializer); 
     } 
     public DbSet<Person> Persons { get; set; } 
    } 
+0

क्या यहां ध्यान देने के लिए कुछ खास बात है? मेरे पास एक कनेक्शन स्ट्रिंग है जिसे के रूप में परिभाषित किया गया है और मेरे ऑनमोडेल क्रिएटिंग में निम्न है, लेकिन मुझे एक त्रुटि मिल रही है "अंतर्निहित प्रदाता ओपन पर असफल रहा": var sqliteConnectionInitializer = new SqliteCreateDatabaseIfNotExists (मॉडलबिल्डर); डाटाबेस .etInitializer (sqliteConnectionInitializer); –

+0

यह मेरा कनेक्शन स्ट्रिंग जैसा दिखता है: ''। क्या इससे कोई फर्क पड़ता है? – RaelB

+0

नहीं, एक रिश्तेदार बनाम पूर्ण पथ का उपयोग करना समस्या प्रतीत नहीं होता है। –

0

आपको अपने मॉडल के लिए टेबल के साथ अपना डेटाबेस प्रारंभ करना होगा। त्रुटि पर ध्यान दें "SQL तर्क त्रुटि या अनुपलब्ध डेटाबेस ऐसी कोई तालिका नहीं: लोग"।

इसका मतलब है कि आपको डेटाबेस में संबंधित तालिकाओं को बनाने के लिए एसक्यूएल चलाने की आवश्यकता है, धन्यवाद, यदि मॉडल संपादक (* .edmx फ़ाइलों) में संदर्भ मेनू के तहत वीएस का उपयोग करना है, तो इसे ऑटो करने का विकल्प है एसक्यूएल उत्पन्न करें और मॉडल के आधार पर आपके लिए डेटाबेस में तालिका प्रविष्टियों को बनाने के लिए इसे निष्पादित करें। नोट: कभी-कभी गैर-एमएस-एसक्यूएल के लिए स्वत: जेनरेट किए जाने वाले मुद्दों में समस्याएं हो सकती हैं जिन्हें संकलित/चलाने से पहले मैन्युअल रूप से ठीक करने की आवश्यकता होती है।

+0

मेरे समझ है कि एफई कोड पहले सभी तालिकाओं स्वचालित रूप से उत्पन्न करनी चाहिए। यह ओआरएम के मुख्य उद्देश्यों में से एक है ... – RaelB

+0

AFAIK, एकमात्र चीज जो पूरी तरह से स्वतः उत्पन्न होती है वह क्लाइंट-साइड सी # मॉडल कक्षाएं होती है, और उन परिभाषाओं को एक नए डेटाबेस मॉडल (जैसे कॉलम) से तुरंत अपडेट किया जा सकता है। एक टेबल में जोड़ा गया), लेकिन दूसरी तरफ जा रहा है (मॉडल -> डीबी लेआउट) केवल एक पूर्ण डीडीएल ड्रॉप/फ़ाइल बनाएँ। –

+1

क्या आप विशेष रूप से SQLite या किसी भी कोड के बारे में बात कर रहे हैं? – RaelB

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