記錄一下經過 EntityFramework6 來操做sqlite過程
環境:sql
- visual studio 2017
- .net 4.5
- Console Application(項目類型)
- sqlite3
- navicat for sqlite
我使用了 navicat for sqlite 這個圖形界面工具來快速生成數據庫的;
很是簡單,打開 navicat ,按照下圖操做便可
新建表:
Entry表(Id爲主鍵,勾選自增),Type_Id爲外鍵.
EntryType表(Id爲主鍵,勾選自增)
數據庫
完事以後點擊左上角的保存!api
打開nuget包管理工具,
在Browse選項卡中搜索 System.Data.SQLite
安裝相應的nuget包,如圖所示
以後在nuget包管理工具中查看已安裝的nuget包
以下圖:
而後在解決方案瀏覽器下能夠看到App.config文件,
進去修改一下內容,在 provider 節點下加入下面的內容:
<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
瀏覽器
namespace MagicMemory.Core.Entities { public class Entry { public int Id { get; set; } public string Key { get; set; } public string Content { get; set; } public int? EntryTypeId { get; set; } public virtual EntryType Type { get; set; } } }
public virtual EntryType Type { get; set; }
markdown
必定要用virtual來修飾,這裏不清楚爲啥,我也是偶然看見的,不用virual就沒用,可能由於是Dbfirst的緣由,以前在.net core結合efcore使用的時候並不須要加virtual也行.這裏的外鍵屬性,Ef 會自動從數據庫裏相應的表中給咱們映射過來.可是這個外鍵所在表也必須在 DbContext中做爲DbSet<>的泛型參數存在才能夠.ide
using System; namespace MagicMemory.Core.Entities { public class EntryType { public int Id { get; set; } public string Name { get; set; } } }
實體類就這兩個,差很少能夠說明問題了,創建實體類的時候,實體類的屬性名必定要和表的字段名相匹配(必須同樣才行),名稱不同的話,則須要在屬性的上方加一個註解屬性
Column("Name")
.也可使用fluentApi來進行配置,我跟喜歡這種方式,在DbContext中重寫OnModelCreating()方法,對 column 進行配置.函數
當實體類型的屬性名須要和不一樣名稱的的表中的列進行映射時,可使用下面的方法.工具
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.BlogId) .HasColumnName("blog_id"); }
using System.Data.Entity; using System.Data.SQLite; using MagicMemory.Core.Entities; using SQLite.CodeFirst; namespace MagicMemory.DbStudy { public class EntryContext:DbContext { public EntryContext():base(new SQLiteConnection("Data Source=MagicMemory.Db"),true) { } protected override void OnModelCreating(DbModelBuilder builder) { builder.Entity<Entry>().ToTable("Entry"); builder.Entity<Entry>() .Property(e => e.EntryTypeId) .HasColumnName("EntryTypeId"); builder.Entity<EntryType>().ToTable("EntryType"); builder.Entity<EntryTag>().ToTable("EntryTagTable"); builder.Entity<EntryTag>() .Property(t => t.Name) .HasColumnName("TagName"); base.OnModelCreating(builder); Database.SetInitializer(new SqliteDropCreateDatabaseWhenModelChanges<EntryContext>(builder)); } public DbSet<Entry> Entry { get; set; } public DbSet<EntryType> EntryType { get; set; } public DbSet<EntryTag> EntryTag { get; set; } } }
這裏比較重要的是重寫了 OnModelCreating() 方法,這個方法裏面經過 fluent api的方式定義了實體類的屬性和具體的數據庫的字段的映射的關係;同時,在默認的構造函數裏面,調用基類的構造函數,由於使用sqlite這個數據庫,因此將繼承了DbConnection的實例: new SQLiteConnection("[鏈接字符串]")
傳遞給基類的構造函數,用來鏈接數據庫.visual-studio