在WINUI 3中使用Entity Framework Core生成模型文件失败求助
问题场景
在打包式桌面WinUI3项目中,通过EntityFrameworkCore.Tools的Scaffold-DbContext命令生成数据库模型后,项目无法构建,抛出APPX1101错误,提示Payload中存在两个相同路径的DbManagerTempModel.deps.json文件,分别来自obj和bin目录。新建空白测试项目重复操作仍出现相同问题,怀疑该流程是否适配WinUI3。
操作流程:
- 创建打包式桌面WinUI3空白应用项目
- 安装
EntityFrameworkCore.SqlServer和EntityFrameworkCore.ToolsNuGet包 - 在包管理器控制台切换至项目目录,执行以下命令:
Scaffold-DbContext "Server=tcp:Server.database.windows.net, 1433;Initial Catalog=ProjectName;User ID=UserID;Password=Password;Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
错误信息:
Error APPX1101
Payload contains two or more files with the same destination path 'DbManagerTempModel.deps.json'.
Source files:
C:\Users\ebagby\Desktop\Temp\DbManagerTempModel\DbManagerTempModel\obj\x86\Debug\net6.0-windows10.0.19041.0\win10-x86\DbManagerTempModel.deps.json
C:\Users\ebagby\Desktop\Temp\DbManagerTempModel\DbManagerTempModel\bin\x86\Debug\net6.0-windows10.0.19041.0\win10-x86\DbManagerTempModel.deps.jsonDbManagerTempModel
C:\Users\ebagby.nuget\packages\microsoft.windowsappsdk\1.2.220902.1-preview1\buildTransitive\Microsoft.Build.Msix.Packaging.targets 1480
解决方案
1. 修改项目文件排除重复文件
在WinUI3项目的.csproj文件中添加以下配置,阻止obj目录下的.deps.json文件被纳入打包范围:
<PropertyGroup> <AppxPackagePayloadExcludes>$(AppxPackagePayloadExcludes);obj\**\*.deps.json</AppxPackagePayloadExcludes> </PropertyGroup>
或者直接移除该文件的Content标记:
<ItemGroup> <Content Remove="obj\**\*.deps.json" /> <None Include="obj\**\*.deps.json" Exclude="**" /> </ItemGroup>
2. 将EF Core代码分离到类库项目(推荐)
WinUI3的MSIX打包机制与普通项目存在差异,将数据访问层分离到独立类库可以从根源避免此类冲突:
- 新建一个与WinUI3项目同框架(如.NET 6)的类库项目
- 在类库中安装
EntityFrameworkCore.SqlServer和EntityFrameworkCore.Tools - 切换到类库项目执行
Scaffold-DbContext生成模型 - 让WinUI3项目引用该类库
这种方式不仅解决打包冲突,还符合分层架构的最佳实践,便于后续维护。
3. 手动调整文件的构建操作
如果不想修改项目文件,可手动调整文件属性:
- 在解决方案资源管理器中启用“显示所有文件”,找到
obj目录下的DbManagerTempModel.deps.json - 右键文件选择“属性”
- 将“生成操作”改为“无”
问题原因
WinUI3的MSIX打包流程会扫描并收集bin和obj目录中的特定文件,而EF Core的Scaffold-DbContext操作可能导致obj目录下的.deps.json被错误标记为需要打包的内容,最终与bin目录的同名文件产生冲突。
内容的提问来源于stack exchange,提问作者E. A. Bagby

