經過EntityFramework操做sqlite(DbFirst)

記錄一下經過 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

在visual studio中創建控制檯項目,安裝必要的nuget包

打開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" />
瀏覽器

創建 Entity 實體類

Entry 類 :

Entry
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; }
    }
}
這裏值得注意的是,Entry實體中有一個外鍵屬性:

public virtual EntryType Type { get; set; }markdown

必定要用virtual來修飾,這裏不清楚爲啥,我也是偶然看見的,不用virual就沒用,可能由於是Dbfirst的緣由,以前在.net core結合efcore使用的時候並不須要加virtual也行.這裏的外鍵屬性,Ef 會自動從數據庫裏相應的表中給咱們映射過來.可是這個外鍵所在表也必須在 DbContext中做爲DbSet<>的泛型參數存在才能夠.ide

EntryType 類:

EntryType
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");
    }

繼承DbContext,創建數據庫上下文 xxxContext 類

EntryContext
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

相關文章
相關標籤/搜索