9

मैंने Getting Started on ASP.NET 5 एंटीटी फ्रेमवर्क 7 के बारे में मार्गदर्शिका का पालन किया और मैंने माइक्रोसॉफ्ट एसक्यूएल सर्वर को स्क्लाइट के साथ बदल दिया, कोड में एकमात्र अंतर स्टार्टअप में है। सीएस:एएसपी.नेट 5, ईएफ 7 और SQLite - SQLite त्रुटि 1: 'ऐसी कोई तालिका नहीं: ब्लॉग'

Microsoft.Data.Sqlite.SqliteException was unhandled by user code
ErrorCode=-2147467259 HResult=-2147467259 Message=SQLite Error 1: 'no such table: Blog' Source=Microsoft.Data.Sqlite
SqliteErrorCode=1 StackTrace: at Microsoft.Data.Sqlite.Interop.MarshalEx.ThrowExceptionForRC(Int32 rc, Sqlite3Handle db) at Microsoft.Data.Sqlite.SqliteCommand.ExecuteReader(CommandBehavior behavior) at Microsoft.Data.Sqlite.SqliteCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader() at Microsoft.Data.Entity.Query.Internal.QueryingEnumerable.Enumerator.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at System.Linq.Enumerable.d__1`2.MoveNext() at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() at Microsoft.Data.Entity.Query.LinqOperatorProvider.ExceptionInterceptor`1.EnumeratorExceptionInterceptor.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at EFGetStarted.AspNet5.Controllers.BlogsController.Index() in d:\arthur\documents\visual studio 2015\Projects\EFGetStarted.AspNet5\src\EFGetStarted.AspNet5\Controllers\BlogsController.cs:regel 18 InnerException:

मुझे यह समझ के रूप में अगर वहाँ 'ब्लॉग' नामक कोई तालिका है, लेकिन जब मैं खोलने:

services.AddEntityFramework() 
    .AddSqlite() 
    .AddDbContext<BloggingContext>(options => options.UseSqlite("Filename=db.db")); 

जब मैं वेबसाइट चलाने के लिए और/ब्लॉग पर जाएँ, मैं कोई त्रुटि मिलती है SQLite के लिए डीबी ब्राउज़र में .db फ़ाइल, वास्तव में 'ब्लॉग' नामक एक तालिका है:

Screenshot from DB Browser for SQLite showing a table called 'Blog'

करता है SQLite कोड में अन्य परिवर्तन की आवश्यकता होती है, या इस इकाई की रूपरेखा के लिए SQLite कनेक्टर में कोई त्रुटि है?

+0

क्या आपके 'BlogsController.Index' विधि कैसा दिखता है? – DavidG

+0

क्या आप सही डेटाबेस से कनेक्ट हैं? – DevilSuichiro

+0

@ डेविड जी 'सार्वजनिक IActionResult इंडेक्स() {वापसी देखें (_context.Blogs.ToList()); } ' –

उत्तर

3

यह संभव है कि वास्तव में ईएफ द्वारा खोला जा रहा डेटाबेस वह फ़ाइल नहीं है जिसे आप डीबी ब्राउज़र में खोल रहे हैं। SQLite प्रक्रिया वर्तमान कार्यशील निर्देशिका का उपयोग करें, जो आईआईएस या अन्य सर्वरों में लॉन्च किया गया है, आपकी स्रोत कोड निर्देशिका से भिन्न फ़ोल्डर हो सकता है। (मुद्दों को देखें https://github.com/aspnet/Microsoft.Data.Sqlite/issues/132 और https://github.com/aspnet/Microsoft.Data.Sqlite/issues/55)।

यह सुनिश्चित करने के लिए कि आपकी डीबी फ़ाइल सही जगह पर है, एक पूर्ण पथ का उपयोग करें। उदाहरण:

public class Startup 
{ 
    private IApplicationEnvironment _appEnv; 

    public Startup(IApplicationEnvironment appEnv) 
    { 
     _appEnv = appEnv; 
    } 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddEntityFramework() 
      .AddSqlite() 
      .AddDbContext<MyContext>(
       options => { options.UseSqlite($"Data Source={_appEnv.ApplicationBasePath}/data.db"); }); 
    } 
} 
+0

इस उत्तर को साझा करने के लिए बहुत बहुत धन्यवाद। मैं एएसपी.NET कोर 1.0 का उपयोग कर इसमें भाग गया। मेरे पास appsettings.json में निर्दिष्ट मेरा डेटा स्रोत था और यह चर को पसंद नहीं करता था इसलिए मैंने इस तरह एक हार्ड-कोडित पथ प्रदान किया: "कनेक्शन स्ट्रिंग्स": { "डिफ़ॉल्ट कनेक्शन": "डेटा स्रोत = सी: \\ aspnetcoresqllitedbs \\ डेटा \\ WebApplication.db " } –

0

मुझे यह समस्या netcoreapp2.0 पर थी। एक संबंधित issue है जो गलती हो सकता है, लेकिन मैं रात के निर्माण पर जाकर इसे हल नहीं करना चाहता था।

मेरे लिए समाधान बिल्डर स्ट्रिंग का उपयोग करने के बजाय SqliteConnection बनाना और पास करना था।

 string id = string.Format("{0}.db", Guid.NewGuid().ToString()); 
     var builder = new SqliteConnectionStringBuilder() 
     { 
      DataSource = id, 
      Mode = SqliteOpenMode.Memory, 
      Cache = SqliteCacheMode.Shared 
     }; 

डि के लिए बहुत की तरह लिखें:

तो इस स्थापना के लिए

 var connection = new SqliteConnection(builder.ConnectionString); 
     connection.Open(); 
     connection.EnableExtensions(true); 
     services.AddDbContext<SomeDbContext>(options => options.UseSqlite(connection)); 

त्रुटि मैं init की इस शैली का प्रयोग किया गया था:

 services.AddDbContext<SomeDbContext>(options => options.UseSqlite(builder.ConnectionString)); 

मेरे मचान इसके लिए एक बार कॉल भी है:

  var dbContext = serviceScope.ServiceProvider.GetService<SomeDbContext>(); 
      dbContext.Database.OpenConnection(); 
      dbContext.Database.EnsureCreated(); 

इस दृष्टिकोण का उपयोग करके SomeDbContext की मेरी सभी डीआई-तत्काल प्रतियां मान्य SQLite डीबी पर इंगित करेंगी, और डीबी के पास मेरी इकाइयों के अनुसार ऑटो-निर्मित स्कीमा होगा।

0

ऐसा लगता है कि चीजें बदली गई हैं क्योंकि IAplicationEnvironment को IHostingEnvironment के साथ बदल दिया गया है।

Removing IApplicationEnvironment \ IRuntimeEnvironment

public class Startup 
{ 
    private IHostingEnvironment _appHost; 

    public Startup(IHostingEnvironment appHost) 
    { 
     _appHost = appHost; 
    } 
    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddEntityFrameworkSqlite() 
      .AddDbContext<MyContext>(
       options => { options.UseSqlite($"Data Source={_appHost.ContentRootPath}/data.db"); }); 
    } 
}