EF6从.NET Framework 4.7迁移至.NET Standard 2.1相关问题咨询
EF6 Database First 迁移.NET Standard 2.1 解决方案
核心问题根因
EF6 仅在 .NET Framework 项目中提供 EDMX 设计器、ADO.NET 实体数据模型新建项等设计时支持,.NET Standard/.NET Core 项目原生不兼容 EF6 的EDMX 设计时能力,这是你遇到前两个问题的根本原因。第三个报错是因为 EDMX 对应的 ssdl/msl/csdl 三个元数据文件没有被正确嵌入程序集,EF 运行时无法加载元数据导致。
分步解决方法
1. 维护 EDMX 不变
- 保留原有 .NET Framework 4.7 的 EF6 类库,所有 EDMX 编辑、模型更新操作都在该项目中完成,EDMX 文件的「生成操作」属性保持默认的
EntityDeploy,确保编译后三个元数据文件会被嵌入该程序集。
2. 迁移业务代码到 .NET Standard 2.1 项目
- 无需复制 EDMX 文件到 .NET Standard 项目,仅需要拷贝 EDMX 自动生成的实体类、DbContext 子类、仓储相关业务代码即可。
- 给 .NET Standard 项目安装 6.4 及以上版本的
EntityFrameworkNuGet包,仅该版本区间的EF6支持.NET Standard 2.1。
3. 修复元数据加载报错
你可以二选一以下两种方案处理元数据加载问题:
方案A:复用原有Framework程序集的嵌入元数据
- .NET Standard 项目和最终的 .NET Core 3.1 Azure Function 项目都添加对原有 .NET Framework 4.7 类库的引用(.NET Core 3.1 兼容引用.NET Framework 4.7 类库)。
- 修改 .NET Standard 项目中 DbContext 的构造函数,指定连接字符串的元数据路径指向Framework程序集的嵌入资源:
public 你的DbContext类名() : base(@"metadata=res://你的Framework程序集名称/你的EDMX文件名.csdl|res://你的Framework程序集名称/你的EDMX文件名.ssdl|res://你的Framework程序集名称/你的EDMX文件名.msl;provider=System.Data.SqlClient;provider connection string='你的实际数据库连接字符串'") { }
如果不需要限定程序集,也可以把程序集名称替换为*,让EF自动扫描所有加载的程序集查找元数据。
方案B:手动嵌入元数据到.NET Standard项目
- 编译一次原有.NET Framework类库,在输出目录中找到生成好的
.csdl/.ssdl/.msl三个文件。 - 将三个文件复制到.NET Standard项目中,选中三个文件,在属性面板将「生成操作」设置为
嵌入的资源。 - 按照上述连接字符串格式,将元数据路径的程序集名称改为你的.NET Standard项目的程序集名称即可。
4. Azure Function 项目额外配置
- 给 Azure Function 项目也安装相同版本的
EntityFrameworkNuGet包。 - 确认Azure Function项目的配置文件中连接字符串的元数据部分和DbContext配置保持一致,没有错误。
效果验证
所有配置完成后,原有仓储逻辑不需要做任何业务修改,编译后运行Azure Function访问数据库,不会再抛出ssdl artifact must be supplied相关报错。
内容的提问来源于stack exchange,提问作者DanScan
相关产品推荐
相关产品推荐

