如何在一个简单的类库中使用实体框架工具进行迁移



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-选项

最新更新