[英]Using C# 9 records as properties in entities with Entity Framework Core
我想在我的项目中使用值对象作为属性(在我的项目中值对象是 C# 9 记录类型)。
实体看起来像这样:
public class Client : IEntity
{
public int Id { get; set; }
public ClientId ClientId { get; set; }
}
而ClientId
值为 object:
public record ClientId
{
private readonly byte[] _bytes;
public ClientId(byte[] bytes)
{
if (bytes is null || bytes.Length != 32)
throw new ArgumentException($"'{nameof(bytes)}' must be 32 bytes long");
_bytes = bytes;
}
public string Value => Base64UrlEncoder.Encode(_bytes);
}
当我进行迁移时,出现以下错误:
找不到适合实体类型“ClientId”的构造函数。 以下构造函数的参数无法绑定到实体类型的属性:无法绑定“ClientId(byte[] bytes)”中的“bytes”; 无法在“ClientId(ClientId 原始)”中绑定“原始”。
我知道发生此错误是因为我没有空构造函数,但我真的不想拥有它,因为我想验证给定_bytes
的长度。 更重要的是,即使我添加了这个空的构造函数:
public record ClientId
{
private readonly byte[] _bytes;
public ClientId()
{
}
public ClientId(byte[] bytes)
{
if (bytes is null || bytes.Length != 32)
throw new ArgumentException($"'{nameof(bytes)}' must be 32 bytes long");
_bytes = bytes;
}
public string Value => Base64UrlEncoder.Encode(_bytes);
}
我收到错误:
实体类型“ClientId”需要定义主键。 如果您打算使用无键实体类型,请在“OnModelCreating”中调用“HasNoKey”。 有关无键实体类型的更多信息,请参阅https://go.microsoft.com/fwlink/?linkid=2141943 。
在我看来,EF Core 将record
类型视为另一个实体并想要创建关系。
我究竟做错了什么?
您必须使用价值转换。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Client>()
.Property(e => e.ClientId)
.HasConversion(
v => v.Value,
v => new ClientId(Base64UrlEncoder.DecodeBytes(v)));
}
在这种情况下,不需要默认构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.