讓EF飛一會兒:如何用Entity Framework 6 串連Sqlite資料庫

來源:互聯網
上載者:User

標籤: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資料庫

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.