Adam Freeman的书和Microsoft文档中写道,要创建和应用迁移,必须使用实体框架工具运行两个命令。
这将创建一个名为Initial的迁移。
dotnet ef migrations add Initial
这是为了应用迁移,这样数据库将根据您的模型创建。
dotnet ef database update
在Alan Freeman的书中,DbContext是由asp.net核心项目直接声明和使用的,但由于我在本例中使用多层模式,因此DbContext在一个单独的类库中。
在我的解决方案中有两个项目:
- VirtualMarket.UI:它是与用户交互的asp.net核心项目
- 引擎:这是一个简单的类库,里面有模型、存储库和DbContext类。我在此库中安装了实体框架核心
在Alan Freeman的书中,DbContext被声明为asp.net核心项目中Startup.ConfigureServices方法中的一个服务。
services.AddDbContext<DataContext>(opts => opts.UseSqlServer(Configuration["ConnectionStrings:ProductConnection"]));
在Startup.ConfigureServices中,我有以下行。
services.AddTransient<IEngine, EngineClass>();
Engine类在项目VirtualMarket.Engine.中
public class EngineClass : IEngine
{
public IPicturesRepository PicturesRepository { get; } = new PicturesRespository();
public IShopsRepository ShopsRepository { get; } = new ShopsRepository();
public IUsersRepository UsersRepository { get; } = new UsersRepository(new DataContext(GetUsersRepositoryOptions()));
private static DbContextOptions GetUsersRepositoryOptions()
{
var optionsBuilder = new DbContextOptionsBuilder();
SqlConnectionStringBuilder connStringBuilder = new SqlConnectionStringBuilder();
connStringBuilder.MultipleActiveResultSets = true;
connStringBuilder.InitialCatalog = "VirtualMarket";
connStringBuilder.DataSource = "(local)";
optionsBuilder.UseSqlServer(connStringBuilder.ConnectionString);
return optionsBuilder.Options;
}
}
问题是,当我运行命令时。。。
dotnet ef migrations add Initial
我得到以下错误
在程序集"VirtualMarket.UI"中未找到DbContext。请确保您使用的是正确的程序集,而类型既不是既不抽象也不通用。
我不想要VirtualMarket.UI中的DbContext类:这会打破多层模式!!有什么(替代(解决方案吗?
您应该使用--项目";以及"--启动项目;";dotnet ef迁移添加";命令在你的情况下--项目";将是具有DBContext类定义的项目--启动项目;将是其中包含Startup.cs文件的UI项目。有关更多信息,您可以在此处查看CLI文档:
https://learn.microsoft.com/en-us/ef/core/miscellaneous/cli/dotnet#common-选项