我正在使用EF Core内存数据库。我对外键(导航属性)的定义有疑问。一个用户可以有多个令牌。因此我的用户表称为Benutzer
,而令牌表称为RefreshToken
:
public class Benutzer
{
[Key]
public int BenutzerId { get; set; }
public string AnmeldeName { get; set; }
public string Passwort { get; set; }
public string BevorzugteSprache { get; set; }
public byte[] Salt { get; set; }
[NotMapped]
public int Iterationen { get => 10000; }
// Navigation property
// [ForeignKey("BenutzerId")]
public virtual List<RefreshToken> RefreshTokens { get; set; }
}
public class RefreshToken
{
[Key]
public int RefreshTokenId { get; set; }
public string Token { get; set; }
// Navigation property
public virtual Benutzer Benutzer { get; set; } // <-- caused a loop
[ForeignKey("BenutzerId")]
public int BenutzerId { get; set; }
}
没有表RefreshToken
中的导航属性,它会部分起作用。我可以为用户添加令牌。如果我请求用户表,则会得到附加的令牌。但是我可以添加一个BenutzerId
不存在的令牌。
现在,我将Navigation属性添加到RefreshToken
表中,请参见上面的代码。这导致了一个循环。
如果我请求用户表,则会得到附加的令牌,这个附加了用户,依此类推。此外,我可以添加一个不存在用户的令牌。
怎么了?
var list = await _dbContext.Set<Benutzer>().ToListAsync();
非常感谢
答案 0 :(得分:0)
您似乎缺少动作导航属性,但拥有FK却没有实体:
public class RefreshToken
{
[Key]
public int RefreshTokenId { get; set; }
public string Token { get; set; }
// Navigation property
public Benutzer Benutzer {get;set;} <<<<<<<<
[ForeignKey("BenutzerId")]
public int BenutzerId { get; set; }
}
答案 1 :(得分:0)
FK定义(如果在FK属性上应指向导航属性,或者在导航属性上,则指向FK:
public virtual Benutzer Benutzer { get; set; }
[ForeignKey("Benutzer")]
public int BenutzerId { get; set; }
或
[ForeignKey("BenutzerId")]
public virtual Benutzer Benutzer { get; set; }
public int BenutzerId { get; set; }
对于EF Core,您实际上并不需要FK属性,您可以将其保留为Shadow属性,以避免在更新参考(设置Benutzer与更改BenutzerId)时造成混淆。
这应该在带有阴影属性的EF Core中起作用:
[ForeignKey("BenutzerId")] // No property declared for BenutzerId, EF will treat it behind the scenes.
public virtual Benutzer Benutzer { get; set; }