EF Core中比较Owned类型属性相等时出错的解决方法
实体模型代码
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
相关产品推荐
相关产品推荐

