使用Entity Framework Core为OwnsOne关联实体种子数据出错
解决EF Core中Owned Entity的种子数据问题
问题原因
Currency是Country的拥有实体(Owned Entity),二者属于嵌入关系,数据存储在同一张countries表中,并非独立的实体表。EF Core不允许在HasData中直接设置Owned实体的导航属性,因此原有代码触发了错误提示。
解决方案
针对Owned Entity的种子数据,需将其属性作为主实体的一部分配置,推荐两种可行方式:
方式1:使用匿名对象映射数据库列
直接对应迁移生成的currency_code、currency_name、currency_symbol列,采用下划线分隔的命名规则(与EF Core默认命名约定一致):
modelBuilder.Entity<Country>().HasData( new { Id = 1, Name = "Afghanistan", Iso3 = "AFG", Currency_Code = "AFN", Currency_Name = "Afghan afghani", Currency_Symbol = "؋" } );
方式2:强类型实例化(需调整实体构造)
若希望使用Country强类型实例,需给Currency添加无参构造函数(可为私有,EF Core可通过反射访问),再初始化Currency属性:
首先修改Currency类:
public class Currency { // 添加私有无参构造函数,供EF Core反射使用 private Currency() { } public Currency(string code, string name, string symbol) { Code = code; Name = name; Symbol = symbol; } public string Code { get; set; } public string Name { get; set; } public string Symbol { get; set; } }
然后配置种子数据:
modelBuilder.Entity<Country>().HasData( new Country { Id = 1, Name = "Afghanistan", Iso3 = "AFG", Currency = new Currency("AFN", "Afghan afghani", "؋") } );
该方式需依赖EF Core对Owned实体的属性解析,更推荐第一种方式,直接适配数据库表结构,无需额外调整实体构造。
验证执行
修改种子数据后,可根据需要重新生成迁移,执行迁移命令后,种子数据会正确写入countries表的对应列中。
内容的提问来源于stack exchange,提问作者Eduardo Silva
相关产品推荐
相关产品推荐

