wordpress版权声明,seo实战培训王乃用,外贸原单,北京国际化品牌设计出于学习和测试的简单需要#xff0c;使用 Console 来作为 EF CORE 的承载程序是最合适不过的。今天笔者就将平时的几种使用方式总结成文#xff0c;以供参考#xff0c;同时也是给本人一个温故知新的机会。因为没有一个完整的脉络#xff0c;所以也只是想起什么写点什么使用 Console 来作为 EF CORE 的承载程序是最合适不过的。今天笔者就将平时的几种使用方式总结成文以供参考同时也是给本人一个温故知新的机会。因为没有一个完整的脉络所以也只是想起什么写点什么不通顺的地方还请多多谅解。 本文对象数据库默认为 VS 自带的 LocalDB 1. Normal Simple
先介绍一种最简单的构建方式人人都会。
新建 Console 应用程序命名自定安装相关Nuget 包
//Sql Server Database ProviderInstall-Package Microsoft.EntityFrameworkCore.SqlServer//提供熟悉的Add-MigrationUpdate-Database等Powershell命令不区分关系型数据库类型Install-Package Microsoft.EntityFrameworkCore.Tools
自定义 DbContext
public class MyContext:DbContext{ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) {optionsBuilder.UseSqlServer(Server(localdb)\\mssqllocaldb;DatabaseConsoleApp;Trusted_ConnectionTrue;MultipleActiveResultSetstrue;);}
}
执行迁移和更新命令
Add-Migration InitializeUpdate-Database
使用方式
using (var context new MyContext())
{ // TODO}
刚以上我们便见识到了了一种最平常也是最简单的使用方式接下来让我们用其他方式去慢慢地改造它从而尽可能地接触更多的用法。
2. Level Up
2.1 准备工作
将第一步生成的数据库迁移文件和使用方式内容全部删除。
2.2 更新 MyContext 内容
删除 MyContext 中的 OnConfiguring 方法及其内容增加含有 DbContextOptions 类型参数的构造器我们的MyContext看起来应该是下面这个样子。
public class MyContext : DbContext{ public MyContext(DbContextOptions options) : base(options) {}
}
假如我们此时仍然再执行迁移命令VS将提示以下错误 No parameterless constructor was found on MyContext. Either add a parameterless constructor to MyContext or add an implementation of IDbContextFactory in the same assembly as MyContext. 添加无参构造器的方式之后再讲解先来按照提示信息添加一个 IDbContextFactory 的实现类。
public class MyContextFactory : IDbContextFactoryMyContext
{ public MyContext Create(DbContextFactoryOptions options) {var optionsBuilder new DbContextOptionsBuilderMyContext();optionsBuilder.UseSqlServer(Server(localdb)\\mssqllocaldb;DatabaseConsoleApp;Trusted_ConnectionTrue;MultipleActiveResultSetstrue;); return new MyContext(optionsBuilder.Options);}
}
之后再次运行迁移和更新数据库的命令也是水到渠成。
2.3 使用方式构造器实例化
既然 MyContext 含有 DbContextOptions 类型参数的构造器那就手动创建一个参数实例注入即可。
var contextOptionsBuilder new DbContextOptionsBuilderMyContext();
contextOptionsBuilder.UseSqlServer(Server(localdb)\\mssqllocaldb;DatabaseConsoleApp;Trusted_ConnectionTrue;MultipleActiveResultSetstrue;);// 注入配置选项using (var context new MyContext(contextOptionsBuilder.Options))
{ // TODO}
经此我们知道了迁移命令会检测 Context 的相关配置入口只有在满足存在 OnConfiguring 方法或者存在自建 IDbContextFactory 实现类的情况下命令才能成功运行。
3. Day Day Up
目前为止我们已经知道如何手动迁移和实例化 Context 的步骤了所以让我们更进一步。写过 ASP.NET CORE 的人可能知道在 ASP.NET CORE 中Context 常常以依赖注入的方式引入到我们的 Web 层Service 层或者 XXCore 层中话说笔者最近最喜欢的解决方案开发架构就是伪 DDD 的四层架构有空再介绍吧。其实在 Console 应用中这也可以很容易实现具体的依赖注入引入可以参考笔者的上一篇博客所以最终的代码效果如下
var serviceCollection new ServiceCollection();
serviceCollection.AddDbContextMyContext(c
{ c.UseSqlServer(Server(localdb)\\mssqllocaldb;DatabaseConsoleApp;Trusted_ConnectionTrue;MultipleActiveResultSetstrue;);
});var serviceProvider serviceCollection.BuildServiceProvider();using (var context serviceProvider.GetServiceMyContext())
{ //context.Database.Migrate();}
至此我们便基本完成了本文的主题唯一有些美中不足的是我们的数据库连接字符串好像到处都是这不是什么大问题笔者直接将 Configuration 的配置代码贴在下面这也是 ABP 中的方式。
public class AppConfigurations{ private static readonly ConcurrentDictionarystring, IConfigurationRoot ConfigurationCache; static AppConfigurations() {ConfigurationCache new ConcurrentDictionarystring, IConfigurationRoot();} public static IConfigurationRoot Get(string environmentName null) { var cacheKey # environmentName; return ConfigurationCache.GetOrAdd(cacheKey,_ BuildConfiguration(environmentName));} private static IConfigurationRoot BuildConfiguration(string environmentName null) { var builder new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(appsettings.json, true, true); if (!string.IsNullOrWhiteSpace(environmentName))builder builder.AddJsonFile($appsettings.{environmentName}.json, true);builder builder.AddEnvironmentVariables(); return builder.Build();}
}
这个工具类的使用方式就不再赘述了。
4. 结尾
最后想必会有人问为什么要折腾这样一个小小的 Console 应用呢其实通过这样一步步下来我们可以发现一些项目功能上的亮点比如既然可以自配置 DbContext 的 Option 选项同时我们也知道了如何在类库和 Console 项目中添加依赖注入以及 Configuration 提取链接参数的功能那针对三层架构或是 DDD 项目增加含真实数据库或是内存数据库InMemory的单元测试或者是自动Migrate Context 和更新数据库也将是十分简单的一件事至少看起来会比官方的示例更加真实和具有可操作性。而这部分内容笔者也将会在之后的博文中给出。
相关文章
Entity Framework Core 生成跟踪列在Apworks数据服务中使用基于Entity Framework Core的仓储Repository实现Entity Framework Core的贴心优雅处理带默认值的数据库字段Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制Entity Framework Core 软删除与查询过滤器Entity Framework Core 命名约定全文索引 - Pomelo.EFCore.MySqlEntity Framework Core 批处理语句
原文地址http://www.cnblogs.com/Wddpct/p/7249670.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注