如何在EF Core中为拥有的JSON列添加注释?

huangapple go评论122阅读模式
英文:

How to add a comment to owned JSON column in EF Core?

问题

"HasComment"调用在尝试使用dotnet ef migrations add创建迁移时会导致失败。给出的消息是:

System.InvalidOperationException: 因为它被配置为导航,所以无法将'Metadata'用作实体类型'MyEntity'的属性。

我理解这个问题的原因可能是因为如果明天我选择将这个'Metadata'存储在单独的表中,那么就无法再有“列注释”了。如何覆盖此行为并添加注释呢?

我唯一想到的方法是手动编辑迁移以添加注释,但这意味着如果我们将来想要编辑注释,就必须再次手动编辑它,所以我更喜欢让EF Core为我们生成指令。

英文:

Given an EF Core entity with an owned type that's stored in a JSON column like so

  1. public class MyEntity
  2. {
  3. public MyEntity( SomeMetadata metadata) : this()
  4. {
  5. Metadata = metadata;
  6. }
  7. /// <summary>
  8. /// Just for EntityFramework because it can't handle a constructor with owned type.
  9. /// </summary>
  10. private MyEntity()
  11. {
  12. }
  13. public Guid PrimaryId { get; private set; }
  14. public SomeMetadata Metadata { get; private set; }
  15. public class SomeMetadata
  16. {
  17. public string? SomeNestedThing { get; set; }
  18. }
  19. }
  20. public class MyEntityConfiguration : IEntityTypeConfiguration<MyEntity>
  21. {
  22. public void Configure(EntityTypeBuilder<MyEntity> builder)
  23. {
  24. builder.OwnsOne(e => e.Metadata, ownedNavigationBuilder =>
  25. {
  26. ownedNavigationBuilder.ToJson();
  27. });
  28. builder.Property(e => e.Metadata)
  29. .HasComment("Comment about this JSON column");
  30. }
  31. }

The HasComment call will result in a failure when trying to create a migration using dotnet ef migrations add. The message given is

> System.InvalidOperationException: 'Metadata' cannot be used as a property on entity type 'MyEntity' because it is configured as a navigation.

I understand that the reason for this is probably because if tomorrow I choose to store this Metadata in a separate table, then I can't have a "column comment" anymore. How can I go about overriding this and adding a comment?

The only thing I've come up with is editing the migration manually to add a comment, but this means that if we want to edit a comment later in the future, we'd have to manually edit it again, so I'd prefer to let EF Core generate the instruction for us.

答案1

得分: 1

Metadata 不是表中的列,它是一个导航属性,应该指向另一张表中包含所需信息的记录。

然而,在您的情况下,您实际上不需要一个导航属性。您可以简单地调整您的代码,使 "JSON" 列成为一个字符串。

  1. public MyEntity(SomeMetadata metadata) : this()
  2. {
  3. Metadata = metadata.SomeNestedThing;
  4. }
  5. public string Metadata { get; private set; }

在进行这些更改之后,Metadata 将成为表中的一个实际列,您用于添加评论的代码将会起作用。

英文:

Metadata is not a column in a table, it is a navigation property, which should point to a record in another table that holds your desired info.

However, in your scenario, you don't really need a navigation property. You can just adjust your code so that the "JSON" column is a string.

  1. public MyEntity(SomeMetadata metadata) : this()
  2. {
  3. Metadata = metadata.SomeNestedThing;
  4. }
  5. public string Metadata { get; private set; }

After these changes, Metadata will be an actual column in the table and your code for adding the comment will work.

huangapple
  • 本文由 发表于 2023年3月7日 21:17:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/75662473.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定