You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:22:05