gpt4 book ai didi

c# - EF Core/DbContext > 将自定义类型映射为主键

转载 作者:行者123 更新时间:2023-12-04 15:29:59 26 4
gpt4 key购买 nike

使用 fluent api,如何将自定义类型映射为 DbContext 类的 OnModelCreating 方法中的主键?

使用 EF Core,我正在尝试为后续实体构建模型。

public class Account
{
public AccountId AccountId { get; }

public string Name { get; set; }

private Account()
{
}

public Account(AccountId accountId, string name)
{
AccountId = accountId;
Name = name;
}
}

其中主键是 AccountId ;类型是一个像这样的简单值对象。
public class AccountId
{
public string Id { get; }

public AccountId(string accountId)
{
Id = accountId;
}
}

OnModelCreating ,我发现我无法映射 AccountId没有后盾。于是我介绍了后台字段 _accountId .我不希望 AccountId 有一个 setter。
public class Account
{
private string _accountId;
public AccountId AccountId { get { return new AccountId(_accountId); } }

public string Name { get; set; }

private Account()
{
}

public Account(AccountId accountId, string name)
{
_accountId = accountId.Id;
Name = name;
}
}

但是我仍然无法弄清楚您如何指定一个具有支持字段的属性,该字段也是主键。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);

var account = modelBuilder.Entity<Account>();

account.ToTable("Accounts");
account.HasKey(x => x.AccountId);
account.Property(x => x.AccountId).HasField("_accountId");
}

OnModelCreating 在属性映射行 ( account.Property(x => x.AccountId).HasField("_accountId"); ) 上引发异常。
声明该属性和字段必须是相同的类型。

最佳答案

正如所指出的,可以利用 使用自定义类型属性作为实体键。 Value Conversion 中的功能EF 核心 2.1

因此,在您自己的示例中,您现在可以像这样为它定义自定义转换,而不是将属性映射到支持字段:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
...
account.HasKey(x => x.AccountId);
account.Property(x => x.AccountId)
.HasConversion(
v => v.Id,
v => new AccountId(v));
}

documentation 中所述,还可以实现 ValueConverter 类以使转换可重用,并且还提供了许多开箱即用的自定义转换器。

注意:实现 IComparable 是个好主意和 IComparable<T>为您定制 AccountId类(class)。因为 EF Core 似乎在内部根据它们的键对更改的实体进行排序以进行批处理,如果您的键不具有可比性,您将收到异常!

关于c# - EF Core/DbContext > 将自定义类型映射为主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49607375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com