无法配置嵌套拥有实体:Entity Framework迁移报错如何解决?
报错含义与解决方案
报错含义
EF Core无法找到用于初始化CompanyAddressesEntity的合适构造函数。你定义的CompanyAddressesEntity(AddressEntity primaryAddress, AddressEntity? secondaryAddress)构造函数中,primaryAddress和secondaryAddress参数无法绑定到实体类型的属性——EF Core仅允许将映射到数据库列的标量属性绑定到构造函数参数,而导航属性(包括对Owned Type的引用)不能作为构造函数参数进行绑定。
修复方案
方案1:添加无参构造函数
给CompanyAddressesEntity添加一个无参构造函数(即使是private修饰符也可以,EF Core能通过反射访问),让EF Core可以先初始化实体,再设置导航属性:
internal sealed class CompanyAddressesEntity { public AddressEntity PrimaryAddress { get; set; } public AddressEntity? SecondaryAddress { get; set; } // 添加私有无参构造函数,供EF Core使用 private CompanyAddressesEntity() {} public CompanyAddressesEntity(AddressEntity primaryAddress, AddressEntity? secondaryAddress) { PrimaryAddress = primaryAddress; SecondaryAddress = secondaryAddress; } }
方案2:调整构造函数参数(可选)
如果你不想添加无参构造,可以将构造函数参数替换为对应Owned Type的标量属性,再在构造函数内部初始化对应的实体实例:
internal sealed class CompanyAddressesEntity { public AddressEntity PrimaryAddress { get; set; } public AddressEntity? SecondaryAddress { get; set; } public CompanyAddressesEntity(string primaryFirstAddressLine, string? secondaryFirstAddressLine) { PrimaryAddress = new AddressEntity(primaryFirstAddressLine); if (secondaryFirstAddressLine != null) { SecondaryAddress = new AddressEntity(secondaryFirstAddressLine); } } }
这种方式下,构造函数参数都是标量属性,EF Core可以正常绑定。
补充说明
EF Core初始化实体时会优先尝试使用有参构造函数,但仅支持绑定直接映射到数据库列的标量属性。Owned Type属于导航属性范畴,并非直接映射的列,因此无法作为构造函数参数被EF Core识别绑定。
内容的提问来源于stack exchange,提问作者Marek M.
相关产品推荐
相关产品推荐

