title author date CreateTime categories
WPF 运行时迁移 EF Core 数据库
lindexi
2019-09-30 20:19:16 +0800
2019-09-30 17:56:38 +0800
WPF

在客户端开发,可以使用 .NET Core 3.0 开发 WPF 程序,可以使用 EF Core 连接数据库。客户端的数据库使用 SQLite 在不同的版本需要在客户端运行做数据库迁移升级数据库

在 WPF 使用 EF Core 可以安装下面的库

  <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.0.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.0.0"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0" />

先创建一个 Model 类,在这个类里面需要添加 Id 属性,如创建资源类

    public class ResourceModel
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { set; get; } public string ResourceId { set; get; } public string ResourceName { set; get; } public string LocalPath { set; get; } public string ResourceSign { set; get; } public string ResourceFileDetail { set; get; }
}

然后创建数据类,用于连接数据库

    public class KekairwuceeYernellijewhebere : DbContext
{
public DbSet<ResourceModel> ResourceModel { get; set; } /// <inheritdoc />
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var file = Path.Combine("FileManger.db");
file = Path.GetFullPath(file);
optionsBuilder
.UseSqlite($"Filename={file}");
}
}

重写 OnConfiguring 方法在里面写连接方法,此时就完成了数据定义,但是还没有创建数据库

使用命令行进行数据库迁移,数据库迁移就是创建数据库相关代码,在第一次进行迁移将会自动创建代码用于创建数据库

dotnet ef migrations add 版本名 

上面代码的版本名可以随意命名,如我是这样写

dotnet ef migrations add Lindexi 

执行上面代码可以看到在项目里面添加了 Migrations 文件夹,这个文件夹里面包含数据库的迁移代码

在主函数可以使用下面代码创建数据库,如果数据库已经创建了那么将什么都不做

            using (var kekairwuceeYernellijewhebere = new KekairwuceeYernellijewhebere())
{
kekairwuceeYernellijewhebere.Database.Migrate();
}

如果只是一次性创建,之后不执行修改的,可以使用 EnsureCreated 函数创建,请看下面代码

            using (var kekairwuceeYernellijewhebere = new KekairwuceeYernellijewhebere())
{
kekairwuceeYernellijewhebere.Database.EnsureCreated();
}

注意使用 EnsureCreated 函数创建之后,将在下次调用 Database.Migrate 函数时提示下面代码

Microsoft.Data.Sqlite.SqliteException:“SQLite Error 1: 'table "ResourceModel" already exists'.”

如果软件更新了,需要修改 ResourceModel 的内容,添加一个属性

   public class ResourceModel
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string Id { set; get; } public string ResourceId { set; get; } + public string WaircegalhallwayneeHuwairfejaije { set; get; } public string ResourceName { set; get; } public string LocalPath { set; get; } public string ResourceSign { set; get; } public string ResourceFileDetail { set; get; }
}

那么在修改代码之后,再次执行迁移命令

dotnet ef migrations add 版本名 

此时建议创建迁移代码,在软件运行的时候执行 Migrate 函数将会自动升级数据库

如果数据库是需要升级的,那么请使用 Database.Migrate 函数创建数据库,之后可以在访问数据库之前调用这个函数让数据库如果没有更新就自动更新

每次调用 Migrate 都需要一定的时间,建议在另一个线程运行

2019-9-30-WPF-运行时迁移-EF-Core-数据库的更多相关文章

  1. [翻译 EF Core in Action 2.3] 理解EF Core数据库查询

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  2. EF Core 数据库迁移(Migration)

    工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github. ...

  3. .net core2.1 - ef core数据库迁移,初始化种子数据

    起因:早上偶然看见一篇文章说是ef core(2.x)使用种子数据,主表子表迁移时候,正常情况下说是无法迁移成功,索性就试试,结果是和ef6的一样,没感觉有什么大的区别.一切OK,见下面内容. 1.首 ...

  4. .Net EF Core数据库使用SQL server 2008 R2分页报错How to avoid the “Incorrect syntax near 'OFFSET'. Invalid usage of the option NEXT in the FETCH statement.”

    一.  问题说明 最近.Net EF core 程序部署到服务器,服务器数据库安装的是SQL server 2008 R2,我本地用的的是SQL server 2014,在用到分页查询时报错如下: H ...

  5. ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成

    ASP.NET Boilerplate 学习   1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...

  6. 第九节:EF Core各种迁移指令(CodeFirst和DBFirst)

    一. CodeFirst模式指令 1.前提: 必须的程序集: Microsoft.EntityFrameworkCore.Tools Microsoft.EntityFrameworkCore.Des ...

  7. 深入理解 EF Core:EF Core 读取数据时发生了什么?

    阅读本文大概需要 11 分钟. 原文:https://bit.ly/2UMiDLb 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能 ...

  8. 深入理解 EF Core:EF Core 写入数据时发生了什么?

    阅读本文大概需要 14 分钟. 原文:https://bit.ly/2C67m1C 作者:Jon P Smith 翻译:王亮 声明:我翻译技术文章不是逐句翻译的,而是根据我自己的理解来表述的.其中可能 ...

  9. asp.net EF core 系列 作者:懒懒的程序员一枚

    asp.net core 系列 19 EFCore介绍写作逻辑一 .概述1.1 比较EF Core 和EF61.2 EF Core数据库提供程序 1.3 引用程序添加数据库提供程序1.4 获取Enti ...

  10. 第一节:EF Core简介和CodeFirst和DBFirst两种映射模式(以SQLite和SQLServer为例)

    一. EF简介 1. 定义 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台的数据访问技术,它还是一种对象关系映射器(ORM),它使.NET 开发人员能够使用面向对 ...

随机推荐

  1. drf模块及源码

    drf中的APIView请求生命周期 APIView的as_view(局部禁用csrf) => 调用父类view中的as_view返回view()方法 => 自己的类调用自己的dispat ...

  2. maven打包时无法识别lombok中@Data生成的get set方法

    开发中使用了lombok,在使用maven编译打包时发现识别不了lombok通过注解@Data在实体类中生成的get,set方法.通过在网上的一篇博客找到了解决的办法,将maven-compiler- ...

  3. oracle习题-emp表查询练习

    emp表查询练习 1 查询emp表的全部记录 Select * from emp; 2 查询出每个雇员的编号.姓名.基本工资 Select empno,ename,sal from emp; 3 查询 ...

  4. 验证python中函数传参是引用传递

    定义: 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数. 引用传递(pass by reference)是指在 ...

  5. Javascript-随滚轮匀速滑动的浮动广告窗动画

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  6. 【python之路14】发送邮件实例

    1.发邮件的代码 from email.mime.text import MIMEText from email.utils import formataddr import smtplib msg ...

  7. mac 下的 homebrew

    如果安装了macport 就不能安装homebrew ,必须先卸载macport $ sudo port -f uninstall installed$ sudo rm -rf \/opt/local ...

  8. Session学习小结

    前言: 1.我们在学习一项技术的时候,首先应该是什么时候会用到这项技术.这次学习session也是如此,一般的web项目中都有用户的存在,有用户那么就有了用户的管理,而用户往往是存在于session中 ...

  9. 【JZOJ3216】【SDOI2013】淘金

    ╰( ̄▽ ̄)╭ 小 Z在玩一个 叫做<淘金者>的游戏.游戏的世界是一个 二维坐标 .X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐标点上均有一块金子,共 N*N 块. 一阵风吹过 ...

  10. <第一周>降维

    PCA 矩阵的主成分就是其协方差矩阵对应的特征向量,按照对应的特征值大小进行排序,最大的特征值为第一主成分,以此类推 主要过程 对所有样本进行中心化 计算样本的协方差矩阵 XX.T 对协方差矩阵做特征 ...