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

EF Core中比较Owned类型属性相等时出错的解决方法

EF Core中Owned类型比较时出现"找不到AuthorName.AuthorId的支持字段"错误

实体模型代码

public sealed class Author
{
    public int AuthorId { get; set; }

    public Guid AuthorGuid { get; set; }
    public required AuthorName Name { get; set; }

    public ICollection<Book> Books { get; set; } = [];
}

[Owned]
public sealed class AuthorName
{
    [MaxLength(248)] 
    public required string FirstName { get; set; }

    [MaxLength(248)] 
    public string? NickName { get; set; }

    [MaxLength(248)] 
    public required string LastName { get; set; }
}

出错的查询代码

.SingleOrDefaultAsync(a => a.Name == author.Name)

错误信息

No backing field could be found for property 'AuthorName.AuthorId' and the property does not have a getter


解决方案

方案1:重写Owned类型的相等性逻辑

EF Core无法自动处理复杂类型的相等比较,直接用==会导致EF误判需要主键字段。给AuthorName实现IEquatable<AuthorName>并重写相等方法,让EF能正确解析比较逻辑:

[Owned]
public sealed class AuthorName : IEquatable<AuthorName>
{
    [MaxLength(248)] 
    public required string FirstName { get; set; }

    [MaxLength(248)] 
    public string? NickName { get; set; }

    [MaxLength(248)] 
    public required string LastName { get; set; }

    public bool Equals(AuthorName? other)
    {
        if (other is null) return false;
        return FirstName == other.FirstName 
               && NickName == other.NickName 
               && LastName == other.LastName;
    }

    public override bool Equals(object? obj)
    {
        return Equals(obj as AuthorName);
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(FirstName, NickName, LastName);
    }

    public static bool operator ==(AuthorName? left, AuthorName? right)
    {
        return EqualityComparer<AuthorName>.Default.Equals(left, right);
    }

    public static bool operator !=(AuthorName? left, AuthorName? right)
    {
        return !(left == right);
    }
}

方案2:查询中显式比较每个属性

如果不想修改AuthorName类,可以在LINQ查询里直接比较Owned类型的各个属性,避免EF的自动解析错误:

.SingleOrDefaultAsync(a => 
    a.Name.FirstName == author.Name.FirstName 
    && a.Name.NickName == author.Name.NickName 
    && a.Name.LastName == author.Name.LastName)

方案3:检查DbContext配置

确保在OnModelCreating中没有误给AuthorName配置主键,Owned类型不需要独立主键:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Author>().OwnsOne(a => a.Name);
    // 不要添加类似 modelBuilder.Entity<AuthorName>().HasKey(x => x.AuthorId); 的配置
}

内容的提问来源于stack exchange,提问作者MoRe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:05:05