SQLite 的 CodeFirst 模式

SQLite 的 CodeFirst 模式,第1张

概述目录 问题描述 解决方案 安装依赖包 修改程序配置 App.config 创建模型对象 Person.cs 创建数据上下文 PersonDbContext.cs 主程序调用 Program.cs 注意事项 相关参考 目前 EF 是 .NET 平台下相当成熟的 ORM 框架,但是其最新发布的 6.x 版本依然不支持 SQLite 的 CodeFirst 模式,好在有大神已经在 Nuget 上发布的相

目录

@H_403_9@问题描述 @H_403_9@解决方案 @H_403_9@安装依赖包 @H_403_9@修改程序配置 App.config @H_403_9@创建模型对象 Person.cs @H_403_9@创建数据上下文 PersonDbContext.cs @H_403_9@主程序调用 Program.cs @H_403_9@注意事项 @H_403_9@相关参考

目前 EF 是 .NET 平台下相当成熟的 ORM 框架,但是其最新发布的 6.x 版本依然不支持 sqlite 的 CodeFirst 模式,好在有大神已经在 Nuget 上发布的相应的 Package 来解决这个问题。笔者通过做一个小实验来验证一下。

问题描述

sqlite 本身不支持 CodeFirst 模式,当我们的数据模型因业务变化而需要修改的话,那对应的数据库表也要进行更改。这个时候,如果我们手动修改数据表的话就不太方便,因此我们需要想办法让其支持 CodeFirst 模式。笔者通过使用 SQLite.CodeFirst 来尝试解决上述问题。

解决方案 安装依赖包

首先我们创建一个控制台程序,安装如下 Package:

@[email protected] @[email protected] 修改程序配置 App.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>  <startup>    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />  </startup>  <!--新增结点-->  <system.data>    <DbProvIDerFactorIEs>      <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" />    <remove invariant="System.Data.sqlite" /><add name="sqlite Data ProvIDer" invariant="System.Data.sqlite" description=".NET Framework Data ProvIDer for sqlite" type="System.Data.sqlite.sqliteFactory,System.Data.sqlite" /></DbProvIDerFactorIEs>  </system.data>    <entityFramework>    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory,EntityFramework">      <parameters>        <parameter value="mssqllocaldb" />      </parameters>    </defaultConnectionFactory>        <!--新增结点-->    <provIDers>      <provIDer invariantname="System.Data.sqlite" type="System.Data.sqlite.EF6.sqliteProvIDerServices,System.Data.sqlite.EF6" />      <provIDer invariantname="System.Data.sqlite.EF6" type="System.Data.sqlite.EF6.sqliteProvIDerServices,System.Data.sqlite.EF6" />    </provIDers>      </entityFramework>  <!--新增结点-->  <connectionStrings>    <add name="sampledb" connectionString="data source=.\sampledb.db" provIDername="System.Data.sqlite" />  </connectionStrings>  </configuration>
创建模型对象 Person.cs
[table("person")]public class Person{    [Column("ID"),Key,autoincrement]    public int ID { get; set; }    [Column("firstname")]    public string Firstname { get; set; }    [Column("lastname")]    public string Lastname { get; set; }}
创建数据上下文 PersonDbContext.cs
public class PersonDbContext : DbContext{    public DbSet<Person> People { get; set; }    /// <summary>    /// 从配置文件读取链接字符串    /// </summary>    public PersonDbContext() :        base("name = sampledb")    {        ConfigurationFunc();    }    /// <summary>    /// 代码指定数据库连接    /// </summary>    /// <param name="existingConnection"></param>    /// <param name="contextOwnsConnection"></param>    public PersonDbContext(DbConnection existingConnection,bool contextOwnsConnection) :        base(existingConnection,contextOwnsConnection)    {        ConfigurationFunc();    }    private voID ConfigurationFunc()    {        Configuration.LazyLoadingEnabled = true;        Configuration.ProxyCreationEnabled = true;    }    protected overrIDe voID OnModelCreating(DbModelBuilder modelBuilder)    {        var initializer = new sqliteDropCreateDatabaseWhenModelChanges<PersonDbContext>(modelBuilder);        Database.Setinitializer(initializer);    }}

此时,当我们修改数据模型时,不需要执行任何 migration *** 作就可以将 数据表映射到新的模型上。下面我们在主程序中调用一下:

主程序调用 Program.cs
class Program{    static voID Main(string[] args)    {        var ptah = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"sampledb.db");        var connection = sqliteProvIDerFactory.Instance.CreateConnection();        connection.ConnectionString = $"Data Source={ptah}";        //using (var context = new PersonDbContext())        using (var context = new PersonDbContext(connection,false))        {            #region 预热:针对数据表较多的情况下建议执行下述 *** 作            var objectContext = ((IObjectContextAdapter)context).ObjectContext;            var mapPingColection = (StorageMapPingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.Csspace);            mapPingColection.GenerateVIEws(new List<EdmSchemaError>());            #endregion            #region 插入数据            Console.Writeline("插入数据:");            context.People.Add(new Person { Firstname = "hippIE",Lastname = "zhou" });            context.SaveChanges();            #endregion            #region 查找数据            Console.Writeline("查找数据:");            foreach (var people in context.People)            {                Console.Writeline($"{people.ID} - {people.Firstname} - {people.Lastname}");            }            #endregion            #region 更改数据            Console.Writeline("更改数据:");            Person person = context.People.Where(p => p.ID == 1)?.FirstOrDefault();            person.Lastname = "Puth";            context.SaveChanges();            #endregion            #region 删除数据            Console.Writeline("删除数据:");            Person person = context.People.Where(p => p.ID == 1)?.FirstOrDefault();            context.People.Remove(person);            context.SaveChanges();            #endregion            Console.ReadKey();        }    }}
注意事项

由于 sqlite.CodeFirst 的 Package 需要依赖 EntityFramework,以及为了能保证数据 *** 作支持异步性,在上述两个 Pacakge 安装的过程中,会同时安装其它依赖包,所以最终的项目依赖包如下所示:

@H_403_9@EntityFramework @[email protected] @[email protected] @[email protected] @[email protected] @[email protected]

此外,需要注意一下 System.Data.sqlite 与 System.Data.sqlite.Core 的区别:

System.Data.sqlite:The official sqlite database engine for both x86 and x64 along with the ADO.NET provIDer. This package includes support for liNQ and Entity Framework 6.

System.Data.sqlite.Core:The official sqlite database engine for both x86 and x64 along with the ADO.NET provIDer.

所以,为了能让 sqlite 支持 CodeFirst,还是一件挺曲折的事情啊。

相关参考 @H_403_9@SQLiteCodeFirst @H_403_9@visual studio 2013 下ef6 CodeFirst 使用SQL Lite 数据库 @H_403_9@来,给Entity Framework热热身 总结

以上是内存溢出为你收集整理的SQLite 的 CodeFirst 模式全部内容,希望文章能够帮你解决SQLite 的 CodeFirst 模式所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1158778.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存