You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:50:59