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

Xamarin Forms iOS应用执行Database.Migrate()失败问题求助

根因说明

该报错为Xamarin.iOS平台特有问题,核心是程序集链接器裁剪了反射调用所需的System.ComponentModel.Annotations类型,或是跨项目依赖传递异常,Android端无此问题是因为双平台的链接器裁剪规则、程序集加载逻辑存在差异。

解决方案

1. 调整链接器裁剪规则(最高概率解决)

Xamarin.iOS的托管链接器会默认删除未被显式静态引用的类型,而EF Core运行时通过反射读取ColumnAttribute等注解,链接器无法识别这类调用会误删类型:

  • 打开iOS项目属性,进入「iOS生成」设置页,先将链接器行为修改为「不链接」,清理解决方案后重新运行测试,若不再报错即可确认是裁剪导致的问题
  • 确认根因后不要长期使用「不链接」配置(会导致安装包体积大幅膨胀),在iOS项目中新增Linker.xml文件,生成操作设置为LinkDescription,文件内容如下:
<linker>
  <assembly fullname="System.ComponentModel.Annotations" preserve="all" />
  <assembly fullname="Microsoft.EntityFrameworkCore" preserve="all" />
  <assembly fullname="Microsoft.EntityFrameworkCore.Sqlite" preserve="all" />
</linker>
  • 改回链接器行为为「仅SDK程序集」重新编译即可

2. 修正依赖引用配置

  • 确保共享项目、Android项目、iOS项目引用的Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Sqlite、System.ComponentModel.Annotations三个NuGet包的版本完全一致,优先选择Xamarin.Forms兼容的稳定版本,推荐使用3.1.x系列的EF Core版本,高版本EF Core对传统Xamarin.Forms的兼容存在缺陷
  • 不要仅在共享项目中引用System.ComponentModel.Annotations,需在iOS项目中单独安装对应版本的该NuGet包,Xamarin.iOS不会自动传递反射调用所需的程序集引用

3. 调整初始化逻辑

原代码在DataContext构造函数中直接执行Database.Migrate(),可能出现配置未加载完成就执行迁移的异常,修改迁移调用逻辑:

// 移除构造函数中的Database.Migrate()调用,在初始化上下文后执行迁移
using var dbContext = new DataContext();
dbContext.Database.Migrate();

4. 清理缓存重新编译

如果以上操作都无效,删除所有项目的bin、obj文件夹,关闭IDE后删除NuGet全局缓存,重新还原所有包再编译运行,排除增量编译导致的旧缓存干扰。

内容的提问来源于stack exchange,提问作者Rynhart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:30:03