我想将SQLite与Entity Framework Core结合使用。我正在关注这个官方教程:
它说要像这样修改project.json:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {
"Microsoft.EntityFrameworkCore.Sqlite": "1.1.0",
"Microsoft.EntityFrameworkCore.Design": {
"version": "1.1.0",
"type": "build"
}
},
"frameworks": {
"netcoreapp1.1": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.1.0"
}
},
"imports": "dnxcore50"
}
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools.DotNet": "1.1.0-preview4"
}
}
我已经安装了VS 2017 RC和Net Core现在使用csproj文件而不是project.json。
我将csproj修改为Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version= "1.1.0-preview4-final"
但是当我尝试命令dotnet ef migrations add MyFirstMigration
时出现以下错误:
"找不到匹配命令的可执行文件" dotnet-ef""
如何使用新的csproj修复此问题?
答案 0 :(得分:4)
VS2017将于2017年3月7日正式发布。该文件涉及VS2015,尚未更新以反映最新的VS 2017变化。像这样修改csproject解决了这个问题:
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="1.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="1.1.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.0" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version = "1.1.0-preview4-final"/>
</ItemGroup>
即使在此之后,当我尝试使用CLI命令运行第一次迁移时:
dotnet ef migrations add MyFirstMigration
我收到以下错误: “在'TContext'上找不到无参数构造函数。要么将无参数构造函数添加到'TContext',要么在与'TContext'相同的程序集中添加'IDbContextFactory'的实现。“
根据this文档,这是因为设计时工具会尝试自动查找应用程序如何创建DbContext类型的实例。如果EF无法找到初始化DbContext的合适方法,则可能会遇到此错误。
我很确定我已经设置了无参数构造函数,并且我能够使用以下CLI命令查看上下文:
dotnet ef database dbContext list
执行迁移的唯一方法是在项目中实现接口IDbContextFactory<TContext>
。文档和有关如何执行此操作的示例基于VS 2015.在VS 2017中IDbContextFactory<TContext>.Create()
需要DBContextFactoryOptions
作为参数:
public class MyContextFactory: IDbContextFactory<MyContext>
{
public MyContext Create(DbContextFactoryOptions options)
{
var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseSqlite("Filename=./mydatabase.db");
return new MyContext(optionsBuilder.Options);
}
}