c# - 我们可以在 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 需要一个值转换器吗?
解决方案
推荐阅读
- json - 我们如何在 Botium Box 中设置代理,在“通用 HTTP(s)/JSON 连接器”中
- python - 井字游戏没有学会取胜
- github - .gitignore 不忽略目录中的文件夹
- kubernetes - 政策 pod 在驱逐时开始
- email - 如何从 .ost 文件恢复已发送的邮件?
- java - Mono/Flux 是否有来自 Stream / Optional API 的 Peek / IfPresent 等运算符?
- c - 相同的 HTTP 请求使用 CURL_CLI 传递,但使用 LIBCURL 失败
- postgresql - 结果集已关闭错误,带有 jdbc 和 postgresql
- python - 为什么 Process 对象的属性在运行后不保留?
- java - 无法在 JPA 中设置默认列值