gpt4 book ai didi

entity-framework-core - EF Core 非原始类型值对象作为主键?

转载 作者:行者123 更新时间:2023-12-04 08:39:01 27 4
gpt4 key购买 nike

我一直在尝试使用值对象作为 Entity Framework 核心中的唯一 id。我已经到了正确保存到数据库的地步,但是 EF 没有正确查询数据库以找到我的实体。看起来 EF 正在加载整个表,然后在内存中进行映射。当我查看查询时,它不包含 id 的谓词。

我正在处理一个现有的数据库,该数据库使用带有填充零的 10 个字符串 ID,因此我正在查看是否可以将它们作为值对象使用。我接下来要尝试的是使用 Guid 并将“SalesOrderNumber”作为单独的字段。不过,这只是针对这种情况,我真正想弄清楚的是,是否可以将值对象用作 Entity Framework 中的主键。

实体:

public class SalesOrder: Entity<SalesOrderNumber>
{
private SalesOrder() { }

public SalesOrder(SalesOrderNumber id, DateTime dueDate)
{
Id = id;
DueDate = dueDate;
Open = true;
}

public override SalesOrderNumber Id { get; protected set; }
public DateTime DueDate { get; private set; }
public bool Open { get; private set; }
}

值对象:
  public class SalesOrderNumber: ValueObject
{
private readonly string _salesOrderNumber;

public SalesOrderNumber(string salesOrderNumber)
{
if (string.IsNullOrWhiteSpace(salesOrderNumber) || salesOrderNumber.Length > 10)
throw new InvalidOperationException($"Sales Order Number {salesOrderNumber} is invalid");

_salesOrderNumber= salesOrderNumber;
}

protected override IEnumerable<object> GetAtomicValues()
{
yield return _salesOrderNumber;
}

public override string ToString() => _salesOrderNumber;
}

数据库配置:
public void Configure(EntityTypeBuilder<SalesOrder> builder)
{
builder.HasKey(e => e.Id);
builder.Property(e => e.Id).HasConversion(number => number.ToString(), s => new SalesOrderNumber(s));

}

我已经查看了其他一些 SO 帖子,但没有一个解决了我遇到的查询问题:
EF Core / DbContext > Map custom type as primary key

最佳答案

您提出的性能问题似乎是github上报告的一个 Unresolved 问题:
EF Core non-primitive type value object as primary key?

有人还报告了一个快速修复:
https://github.com/aspnet/EntityFrameworkCore/issues/13669#issuecomment-439589393
如果我理解快速修复正确,添加从值对象到支持基元类型的隐式转换运算符,以及向后方向的隐式转换运算符,可能会解决您的问题。如果这对您有用,请发表评论。

关于entity-framework-core - EF Core 非原始类型值对象作为主键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53328201/

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