更新:下面列出的示例代码现已完整,足以在会议中生成影子备用密钥。当会议实体继承自包含 RowVersion 属性的基本实体时,会在会议实体中生成影子备用键。如果该属性直接包含在会议实体中而不是继承,则不会生成影子备用键。
我的模型在 EF Core 3.1 中按预期工作。我升级到 .Net 5 和 EF Core 5,EF 向多个实体添加了名为 TempId 的影子备用键属性。除非我将这些属性添加到数据库,否则 EF 无法加载这些实体。我在模型中找到的任何关系中都未使用影子备用键属性。事实上,所有关于影子属性的讨论要么是针对外键,要么是针对隐藏属性。我找不到任何解释为什么 EF 会添加影子备用键,特别是如果它不使用该属性。有什么建议么?
获得影子备用密钥的实体之一是 Conference,它是一种关系中的子实体和另一种关系中的父实体。我有许多类似的实体,它们没有获得影子备用密钥,而且我看不出它们之间有任何区别。
我使用主键的备用键循环遍历模型实体,识别所有影子属性和所有关系。关系中不使用影子备用键。我确实看到了两个定义的关系,其中我专门使用了备用键,所以我相信我的代码是正确的。
这是一个完整简化的 EF 上下文及其两个实体,演示了该问题。
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace EFShadow
{
public partial class Conference
{
public Conference()
{
Meetings = new HashSet<Meeting>();
}
[Key]
public string ConferenceCode { get; set; }
[Required]
public string ConferenceName { get; set; }
public ICollection<Meeting> Meetings { get; }
}
public partial class Meeting : BaseEntity …Run Code Online (Sandbox Code Playgroud)