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