实体框架核心1:n关系导致循环

时间:2020-11-05 09:30:17

标签: c# asp.net entity-framework-core

我正在使用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();

非常感谢

2 个答案:

答案 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; } 
相关问题