標籤:des style blog http color io os ar for
擷取Sqlite
1.可以用NuGet程式包來擷取,它也會自動下載EF6
2.在Sqlite官網上下載對應的版本:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
注意這裡面每個.net framework都有兩個版本,一個帶有bundle字眼,一個沒有。一個安裝的DLL裡麵包含SQLite.Interop.dll,而另一個沒有。如果你運行代碼的時候報
“無法載入SQLite.Interop.dll”的錯誤,則將安裝檔案中的SQLite.Interop.dll拷貝到Bin檔案中即可。或是在NuGet下載的packages\System.Data.SQLite.Core.1.0.94.0\build中也有對應的程式。
範例程式碼
Model.cs
public class Person { public Int64 Id { get; set; } //注意要用Int64 public string FirstName { get; set; } public string LastName { get; set; } } public class MyContext : DbContext { public DbSet<Person> Persons { get; set; } public MyContext() : base("SqliteTest") { } }
Program.cs
static void Main(string[] args) { MyContext context = new MyContext(); var empList = context.Persons.OrderBy(c => c.FirstName).ToList(); Console.WriteLine(empList.Count); Person people = new Person() { FirstName = "Hello", LastName = "World" }; context.Persons.Add(people); context.SaveChanges(); Console.ReadLine(); }
範例程式碼很簡單,就是用EF對Person表進行新增與查看。
配置config檔案
如果你是用NuGet擷取Sqlite,會自動在config中配置一些相關的資訊。
<?xml version="1.0" encoding="utf-8"?><configuration> <configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <connectionStrings> <add name="SqliteTest" connectionString="data source=SqliteTest.db" providerName="System.Data.SQLite.EF6" /> </connectionStrings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.data> <DbProviderFactories> <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".NET Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" /> <remove invariant="System.Data.SQLite" /> <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" /> </DbProviderFactories> </system.data> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <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></configuration>
View Code
其中資料連線串是:
<add name="SqliteTest" connectionString="data source=SqliteTest.db" providerName="System.Data.SQLite.EF6" />
注意提供者集是System.Data.SQLite.EF6。
但是這個配仍然是錯誤的。
如果此時運行程式,會報錯:
Unable to determine the provider name for provider factory of type ‘System.Data.SQLite.SQLiteFactory‘. Make sure that the ADO.NET provider is installed or registered in the application config.
或中文錯誤資訊:
未找到具有固定名稱“System.Data.SQLite”的 ADO.NET 提供者的Entity Framework提供者。請確保在應用程式設定檔的“entityFramework”節中註冊了該提供者。
意思是EF沒有找到提供System.Data.SQLite.SQLiteFactory的dll,我們看看現在config中的entityFramework節點:
<entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="v11.0" /> </parameters> </defaultConnectionFactory> <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.SQLite.EF6與System.Data.SqlClient,確實沒有名稱為System.Data.SQLite的提供者。這裡我一直不明白為什麼sqlite會去找名稱為System.Data.SQLite的提供者,因為我們在串連串中配置的provider也是System.Data.SQLite.EF6。
那我們就在EF的配置節點中增加一個名為System.Data.SQLite的provider,但type仍然是System.Data.SQLite.EF6。最終的配置
紅色部分是配置有變化的地方。
這裡再運行程式就可以了。
注意:
1.串連串的配置。
資料連線串可以指定絕對位址,也可以指定相對位址。像我的data source=SqliteTest.db,則SqliteTest.db要在Bin檔案夾中,如果是web程式可以通過Data Source=|DataDirectory|\SqliteTest.db來配置在App_Data檔案平中。
2.如果沒有指定資料庫中的表檔案名稱,EF產生的SQL表都是用複數表示。就像我的程式中實體名是Person,但EF去尋找的表名會是People。所以在資料庫中定義的表名是People。
3.不支援CodeFirst模式,您需要自己先設計好Sqlite的表結構。
範例程式碼(packages檔案太大,所以刪除了):SqliteLinqTest.zip
讓EF飛一會兒:如何用Entity Framework 6 串連Sqlite資料庫