gpt4 book ai didi

c# - 实体类型 'Uri' 需要定义主键

转载 作者:行者123 更新时间:2023-11-30 20:16:18 26 4
gpt4 key购买 nike

我引用了一个通用模型,所以我无法控制其中的属性。假设它看起来像这样:

  public class Message
{
public Guid Id { get; set; }
public string Sender { get; set; }
public Uri Uri { get; set; }
}

UriSystem.Uri

在我的上下文中,我然后覆盖 OnModelCreating 以设置主键:

  public DbSet<Message> Messages { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Message>()
.HasKey(i => i.Id);
}

然后我在我的数据库初始化程序中运行 Initialize:

  public void Initialize()
{
_logger.Information("Ensuring database is created.");

_messageContext.Database.Migrate();
}

但是得到如下错误:

实体类型“Uri”需要定义主键。

关于如何解决这个问题的任何提示?

编辑:

显然这是一个 known issue .

最佳答案

实体只能包含两种属性类型(可供 EF 使用):

  1. 映射到原始 SQL 类型(string、int、bool 等)的类型。
  2. EF 中定义的实体类型。

由于 Uri 未映射到原始 SQL 类型,因此 EF 尝试将其视为一个实体来处理。

实体存储在单独的表中。要将实体存储在表中,它需要一个唯一的 ID。


有很多方法可以解决这个问题。我建议的方法保留 Uri 但阻止 EF 尝试使用它。

第 1 步 - 制作 Uri [NotMapped]

这使得 EF 忽略 Uri 属性,因为它无法正确处理它。

[NotMapped]
public Uri Uri { get; set; }

第 2 步 - 创建 EF 应该处理而不是 Uri 的字符串属性。

字符串值派生自(现在隐藏的)Uri 属性,但 EF 看不到它。它只看到可用的字符串属性。

public String URL 
{
get
{
return this.Uri.AbsoluteUri;
}
set
{
this.Uri = new Uri(value);
}
}

这应该可以解决问题。在代码中,您直接使用 Uri 属性(就像您已经在做的那样),但是您已经设置了您的实体,因此 EF 改为使用 URL 字符串属性。
在 EF 检索实体并设置其属性(包括 URL 字符串属性)后,Uri 属性也会隐式创建,您可以继续使用它。

关于c# - 实体类型 'Uri' 需要定义主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49508954/

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