EF Core嵌套拥有类型与记录类型结合的构造器错误及疑问
EF Core嵌套记录类型作为拥有类型时「No suitable constructor was found」问题
问题场景
当使用**嵌套的记录类型(值对象)**作为EF Core的拥有类型时,会触发「No suitable constructor was found」错误。但单层级的记录类型作为拥有类型时,使用简化记录语法(如public record Address(string Street, string City);)就能正常工作。
可复现代码
实体类与嵌套记录类型
// 单层级记录(可正常工作) public record Address(string Street, string City); // 嵌套记录(执行数据操作时报错) public record ContactInfo(Address Address, string PhoneNumber); // 实体类 public class Customer { public int Id { get; set; } public ContactInfo Contact { get; set; } } // DbContext配置 public class AppDbContext : DbContext { public DbSet<Customer> Customers { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Customer>().OwnsOne(c => c.Contact); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("YourConnectionString"); } }
执行查询、添加等数据操作时,会抛出错误:
No suitable constructor was found for entity type 'ContactInfo'. The following constructors had parameters that could not be bound to properties of the entity type: cannot bind 'address', 'phoneNumber' in 'ContactInfo(Address address, string phoneNumber)'.
解决方法
放弃简化记录语法,手动编写包含私有无参构造器的完整记录类型:
public record ContactInfo { private ContactInfo() { } // 必须添加私有无参构造器 public ContactInfo(Address address, string phoneNumber) { Address = address; PhoneNumber = phoneNumber; } public Address Address { get; init; } public string PhoneNumber { get; init; } }
修改后,嵌套的拥有类型即可被EF Core正常处理。
疑问
为什么单层级的拥有类型可以直接使用简化记录语法(自动生成的构造器就能被EF Core识别),而嵌套的拥有类型却必须手动添加私有无参构造器才能正常工作?
内容的提问来源于stack exchange,提问作者Ozkan
相关产品推荐
相关产品推荐

