繁体   English   中英

使用 C# 9 条记录作为 Entity Framework Core 实体中的属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM