一、前提概要

今年某天突然无聊,就决定学习.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. AtCoder AGC037D Sorting a Grid (二分图匹配)

    题目链接 https://atcoder.jp/contests/agc037/tasks/agc037_d 题解 这场D题终于不像AGC032D和AGC036D一样神仙了-- 还是可做的吧 虽然考场 ...

  2. linux下安装R第三方包forecast

    ERROR: [root@localhost soft]# R CMD INSTALL curl_3.1.tar.gz WARNING: ignoring environment value of R ...

  3. C++入门经典-例3.5-判断某一年是否是闰年之嵌套判断

    1:代码如下: // 3.5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  4. 20175215 2018-2019-2 第八周java课程学习总结

    第十五章 泛型与几何框架 15.1 泛型 泛型(Generics)是在JDK1.5中推出的,其主要目的是可以建立具有类型安全的集合框架,如链表.散列映射等数据结构. 15.1.1 泛型类声明 可以使用 ...

  5. TCP之LAST_ACK状态

    前提: A:主动关闭: B:被动关闭: A执行主动关闭,发送FIN,B收到FIN,发送ACK,进入CLOSE_WAIT,B发送FIN,进入LAST_ACK等待最后一个ACK到来: 关闭方式: (1) ...

  6. LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...

  7. numpy小记

    import numpy as np # a=np.array([[1,3,2],[4,5,6]]) print(a) a=np.arange(1,13).reshape((3,4))#生成一个3行4 ...

  8. laravel 发送html邮件是a标签中的url不显示问题

  9. RF问题收集

    console中不打印日志 报错信息: 修改pop方法: try: result = result.decode('UTF-8') except UnicodeDecodeError: pass re ...

  10. 1.7 本机单步调试(Intellij IDEA)

    先编译好要调试的程序. 1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可. 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试. IDE下方出现Debug视图,红色的箭头指 ...