首页 > 解决方案 > 我们可以在 EF Query Where 子句中使用 ValueObjects 吗?

问题描述

在我的用户存储库中,我想使用:

class UserRepository
{
   readonly DbContext _context;

   Task<User> GetByUsernameAsync(Username username)
   {
        // Query based on Username ValueObject
        return await _context.Users.SingleOrDefaultAsync(
            u => u.Username.Equals(username));
   }
}

但这给了我:

System.InvalidOperationException:找不到属性“Username.UserDbId”的支持字段,并且该属性没有 getter。

相反,我必须使用:

class UserRepository
{
   readonly DbContext _context;

   Task<User> GetByUsernameAsync(Username username)
   {
        // Query based on Value property of Username
        return await _context.Users.SingleOrDefaultAsync(
            u => u.Username.Value.Equals(username.Value));
   }
}

我的设置...

用户名

public class Username : ValueObject
{
    public string Value { get; private set; }

    public Username(string value)
    {
        // Some guard conditions

        // Set property
        Value = value;
    }
}

用户

public class User : Entity
{
    public Username Username { get; private set; }

    public User(Username username)
    {
        Username = username;
    }
}

用户地图

internal class UserMap : IEntityTypeConfiguration<User>
{
    public void Configure(EntityTypeBuilder<User> builder)
    {
        builder.ToTable("Users");

        builder.Property<int>("DbId").HasColumnName("DbId").UseIdentityColumn();
        builder.HasKey("DbId");        

        builder.OwnsOne<Username>("Username", b =>
        {
            b.Property("Value").HasColumnName("Username").IsRequired();
            b.HasIndex("Value").IsUnique();
        });
        builder.Navigation("Username").IsRequired();
    }
}

我注意到我的查询的第一个版本没有调用我的 ValueObject 基类上的 Equals 函数。

EF 需要一个值转换器吗?

标签: c#entity-framework-coreowned-types

解决方案


推荐阅读