.NET7 MAUI Blazor中EF迁移循环依赖问题解决求助
.NET 7 MAUI Blazor + EF Core SQLite 创建迁移失败问题解决
问题概述
前期调研
- 已排除类库迁移MSB4006重复问题,确认已安装
Microsoft.EntityFrameworkCore.Tools - 尝试过
add migration命令的多种组合,包括--context和--startup-project参数 - 分别在
.sln和.csproj目录下执行命令并调整路径,均未解决
配置信息
- 项目为JetBrains Rider搭建的.NET 7 MAUI Blazor应用,仅针对Windows平台
- 目标框架配置:
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net7.0-windows10.0.19041.0</TargetFrameworks>
- EF Core SQLite版本为
v7.0.8,已安装相关包:
Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.8" Microsoft.EntityFrameworkCore.Tools" Version="7.0.8"
- 调试模式可正常启动,
.db文件能正常创建,CreateMauiApp()代码:
builder.Services.AddEntityFrameworkSqlite().AddDbContext<DatabaseContext>(); using (var client = new DatabaseContext()) { client.Database.EnsureCreated(); client.Database.Migrate(); }
DatabaseContext核心代码:
public DbSet<SourceFile> SourceFiles { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var dataSource = Path.Combine(@"D:\DEVELOPPMENT", "FileManager", "app.db"); var directory = new FileInfo(dataSource).Directory; Directory.CreateDirectory(directory?.FullName ?? throw new InvalidOperationException()); var connectionStringBuilder = new SqliteConnectionStringBuilder {DataSource = dataSource}; var connectionString = connectionStringBuilder.ToString(); var connection = new SqliteConnection(connectionString); optionsBuilder.UseSqlite(connection); }
错误信息
执行以下命令创建迁移时:
dotnet ef migration add Create SourceFile -s .\FileManager.App.csproj -c FileManager.App.Data.DatabaseContext
出现错误:
error MSB4006: There is a circular dependency in the target dependency graph involving target "GetEFProjectMetadata". Unable to retrieve project metadata. Ensure it's an SDK-style project. If you're using a custom BaseIntermediateOutputPath or MSBuildProjectExtensionsPath values, Use the --msbuildprojectextensionspath option.
解决方案仅包含单个项目FileManager.App.csproj,无其他纳入解决方案的.csproj文件。
解决方案
1. 修正迁移命令语法错误
迁移名称不能包含空格,原命令中Create SourceFile会被解析为两个参数,导致命令执行异常。正确命令需合并迁移名,并添加目标框架参数:
dotnet ef migrations add CreateSourceFile -s .\FileManager.App.csproj -c FileManager.App.Data.DatabaseContext --framework net7.0-windows10.0.19041.0
2. 调整DbContext配置方式
将连接配置移到AddDbContext注入时指定,避免迁移工具无法正确读取OnConfiguring中的硬编码配置:
修改CreateMauiApp():
var dataSource = Path.Combine(@"D:\DEVELOPPMENT", "FileManager", "app.db"); var directory = new FileInfo(dataSource).Directory; Directory.CreateDirectory(directory?.FullName ?? throw new InvalidOperationException()); var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = dataSource }; var connectionString = connectionStringBuilder.ToString(); builder.Services.AddDbContext<DatabaseContext>(options => options.UseSqlite(connectionString)); // 保留初始化逻辑(使用依赖注入获取上下文) using (var scope = builder.Services.BuildServiceProvider().CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<DatabaseContext>(); dbContext.Database.EnsureCreated(); dbContext.Database.Migrate(); }
同时移除DatabaseContext中的OnConfiguring方法,或添加判断确保迁移场景下的兼容性:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { // 原配置逻辑 } }
3. 指定MSBuild项目扩展路径
若上述方法无效,尝试指定中间输出路径,解决MAUI项目的元数据读取问题:
dotnet ef migrations add CreateSourceFile -s .\FileManager.App.csproj -c FileManager.App.Data.DatabaseContext --framework net7.0-windows10.0.19041.0 --msbuildprojectextensionspath .\obj
4. 验证工具版本兼容性
确认Microsoft.EntityFrameworkCore.Tools与Microsoft.EntityFrameworkCore.Sqlite版本完全一致(均为7.0.8),避免版本不兼容导致的异常。
内容的提问来源于stack exchange,提问作者Mathieu VIALES
相关产品推荐
相关产品推荐

