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
相关产品推荐
相关产品推荐

