一、前提概要

今年某天突然无聊,就决定学习.net core,此时的版本已经是.net core 1.1了。之前一直是用.net framework做项目,一直对Html.EditFor()等Html Helper不爽,感觉灵活性太差,此次看了微软的docs文档后,感觉到了.net core的强大之处,特别是Tag Helper,便决定投身到此平台中,但在新项目中发现了一个问题:之前做项目都是将数据库模型放在单独类库中,但现在发现.net core 类库的配置不一样,总是有问题,于是开始用bing的国际版(顺便鄙视下某度)搜索资料,在github的aspnet项目组的issues中和stackoverflowk中搜寻答案,终于找到了解决方法。

二、参考资料

https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet#targeting-class-library-projects-is-not-supported
https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext
http://benjii.me/2016/06/entity-framework-core-migrations-for-class-library-projects/
https://github.com/aspnet/EntityFramework/issues/5320

三、具体解决办法

1、新建.net core web 应用程序名为TestMigrationInClassLibrary

2、新建一个.net core class library 命名为NetDomain

3、在TestMigrationInClassLibrary引用NetDomain

4、在NetDomain类库中进行以下步骤:

(1)在*.csproj中添加Microsoft.EntityFrameworkCore.Tools.DotNet

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
</ItemGroup>

(2)添加package Microsoft.EntityFrameworkCore.Design

使用cmd控制器,进入该类库文件夹目录使用如下命令

dotnet add package Microsoft.EntityFrameworkCore.Design

添加上述两个必备文件后的*.csproj的最终样式如下:

<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" PrivateAssets="All" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
</ItemGroup>
</Project>

(3)利用nuget安装SqlServer

Install-Package Microsoft.EntityFrameworkCore.SqlServer

(4)添加Model

public class Course
{
public int ID { get; set; }
public string Name { get; set; }
public string Remarks { get; set; }
}

(5)添加DbContext

public class CourseDbContext : DbContext
{
public CourseDbContext(DbContextOptions<CourseDbContext> options) : base(options)
{
} public DbSet<Course> Courses { get; set; }
}

(6)添加ContextFactory

public class CourseDbContextFactory : IDbContextFactory<CourseDbContext>
{
public CourseDbContext Create(DbContextFactoryOptions options)
{
var optionsBuilder = new DbContextOptionsBuilder<CourseDbContext>();
optionsBuilder.UseSqlServer("Server=(LocalDb)\\MSSQLLocalDB;Database=TestClassLibrary;Trusted_Connection=True;MultipleActiveResultSets=true"); return new CourseDbContext(optionsBuilder.Options);
}
}

5、在类库所在目录下使用如下命令开启Migration

dotnet ef --startup-project ../TestMigrationInClassLibrary migrations add Initial -c CourseDbContext

要注意"../TestMigrationInClassLibrary"是作为类库的入口工程,没有这个入口的话,是无法启动Migration的。

6、更新数据库

dotnet ef database update --startup-project ../TestMigrationInClassLibrary

同样也需要添加入口工程TestMigrationInClassLibrary

四、总结

因为.net core 类库不像.net standard类库一样具有启动功能,必须指定其他可启动的工程作为入口,所以每一次的Migration都得加上"--startup-project XXX"。

为了能够将数据库模型独立出来,还是需要费一番周折,但是.net core的其他优点还是远远胜于传统的.net。要想入门.net core,还是建议多看微软官方的docs和去github中Fork下整个源代码。

将数据库模型放入到.Net Core的类库中的更多相关文章

  1. C语言:把分数最低的学生数据放入数组b所指的数组中,-从键盘输入若干字符串,写入文件myfile4中,用-1作字符输入结束的标志,

    //学生记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组中,fun函数:把分数最低的学生数据放入数组b所指的数组中,分数最低的学生可能不止一个.人数返回. #include <st ...

  2. 'QObject& QObject::operator=(const QObject&)' is private——无法将自定义的QObject子类放入Qt容器(container)中

    先贴出问题的代码: #include<QCoreApplication> classMyObject:publicQObject { public: MyObject(QObject*pa ...

  3. .NET Core在类库中读取配置文件appsettings.json

    在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别 ...

  4. .Net core 在类库中获取配置文件Appsettings中的值

    大多数情况,我们开发的程序中都含有很多个类库和文件夹,有时候,我们会遇到程序中的类库需要获取配置文件的信息的情况. 像dapper 中需要使用连接字符串的时候,那么我们一直从主程序中传值这是个不好的方 ...

  5. 【转】【Android测试技巧】01. root后adb shell默认不是root用户时,如何将文件放入手机系统中

    http://blog.csdn.net/wirelessqa/article/details/8624208 有些机器root后通过adb shell 后,默认不是root用户,需要输入 su才能切 ...

  6. java使用POI将数据导出放入Excel

    本文主要是将数据库取出的数据按照自定义的行列格式导出到excel中,POI则是实现我们需求所用到的技术. POI介绍 使用spring boot导入相关依赖 获取数据(自行处理) 完整代码实例:创建e ...

  7. 在区块链上表白——使用C#将一句话放入比特币的区块链上

    最近在看区块链和比特币的知识,顺便简单研究了一下BitCoin的脚本语言,发现OP_RETURN这个命令可以在后面放入自己想说的内容,很多侧链啊,公证之类就是利用了这个特性,可以把一句话,或者一个哈希 ...

  8. EC笔记:第三部分:17、使用独立的语句将newed对象放入智能指针

    一般的智能指针都是通过一个普通指针来初始化,所以很容易写出以下的代码: #include <iostream> using namespace std; int func1(){ //返回 ...

  9. tuple放入dict中

    tuple放入dict中是否可以正常运行 # 将tuple放入dict中 a = ('AI','Kobe','Yao') b = ('AI',['Kobe','Yao']) dict1 = {'a': ...

随机推荐

  1. linux下安装R

    下载 版本:R3.2.2 下载地址:http://cran.rstudio.com/src/base/R-3/R-3.2.2.tar.gz 安装步骤: 解压 tar -zxvf R-3.2.2.tar ...

  2. windows基础提权

    Window基础提权 提到system权限 甚至让他变成你的肉鸡 我们了解一下windows下面有那些用户 Guests是用户最低的权限 而且一般是被禁用的 User权限也很低 连关机都不行 还有wi ...

  3. C++入门经典-例6.19-字符串类型之修改string字符串的单个字符串

    1:头文件 #include <string> 声明一个string变量,形式如下: std::string s; 初始化string类型的变量: std::string s1(" ...

  4. AES加密算法在Linux下出现随机加密结果

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  5. 第五次实验报告&学习总结

    一.实验目的 (1) 理解抽象类与接口的使用; (2)了 解包的作用,掌握包的设计方法. 二.实验要求 (1)掌 握使用抽象类的方法. (2)掌 握使用系统接口的技术和创建自定义接口的方法. (3) ...

  6. D4下午

    开始学图论辣 图的基本模型 图是点和边组成的集合体,G = <V, E> v是点集,e是边集 还有就是有向图无向图啥的 算了太水了不写了 提几个没大见过的吧 环 环上任意两点间可以随意到达 ...

  7. react介绍、环境搭建、demo运行实例

    React官网:https://reactjs.org/docs/create-a-new-react-app.html cnpm网址:http://npm.taobao.org/ 1.react介绍 ...

  8. Selenium 2自动化测试实战12(获得验证信息)

    一.获得验证信息 通常用的最多的几种验证信息分别是:title.URL和text 运行脚本之后,结果如下图所示: #coding:utf-8 from selenium import webdrive ...

  9. Jmeter+Ant+Jenkins接口自动化持续集成环境搭建(Linux)

    一.安装说明 系统环境:CentOS release 6.4 JDK版本:jdk1.8.0_181 Jmeter版本:apache-jmeter-3.0 Ant版本:apache-ant-1.9.13 ...

  10. mysql 各数据类型的大小及长度

    数字型 类型 大小 范围(有符号) 范围(无符号) 用途 TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767) (0, ...