簡體   English   中英

相同類型的多個導航屬性的關系配置?

[英]Relashionship configuration of multiple navigation properties of same type?

1)我正在嘗試建立兩個班級之間的關系。 所以,我有以下 class

 public class Team
{
    [Key]        
    public int Id { get; set; }

    public string Team { get; set; }

    public List<MatchGame> MatchGames { get; set; }
}

public class MatchGame
{
    [Key]
    public int Id { get; set; }

    public int HomeTeamId { get; set; }
    public Team HomeTeam { get; set; }
   
    public int AwayTeamId { get; set; }
    public Team AwayTeam { get; set; }

}

我嘗試執行 relashioship 的配置是

   protected override void OnModelCreating(ModelBuilder modelBuilder)
    {

        modelBuilder.Entity<MatchGame>()
            .HasOne(h => h.HomeTeam)
            .WithMany(m => m.MatchGames)
            .HasForeignKey(k => k.HomeTeamId)
            .OnDelete(DeleteBehavior.Cascade);

        modelBuilder.Entity<MatchGame>()
            .HasOne(h => h.AwayTeam)
            .WithMany(m => m.MatchGames)
            .HasForeignKey(k => k.AwayTeamId)
            .OnDelete(DeleteBehavior.NoAction);
    }

產生的錯誤是:

無法在“Team.MatchGames”和“MatchGame.AwayTeam”之間創建關系,因為“Team.MatchGames”和“MatchGame.HomeTeam”之間已經存在關系。 導航屬性只能參與單個關系。 如果您想在“OnModelCreating”中首先在導航“MatchGame.AwayTeam”上覆蓋現有關系調用“Ignore”。

我也看到了以下線程,但找不到關系無法建立的原因。

EF 代碼優先:一對多兩次到相同的集合類型

https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/fluent/relationships

EFCore - 如何將多個導航屬性設置為同一類型?

2)另外,為了不創建新帖子:我想讓public string Team { get; set; } public string Team { get; set; } public string Team { get; set; }在 Class 團隊中是唯一的。 我嘗試了一些我見過但沒有用的 DataAnnotation。 我必須為此目的使用什么。

問題是您嘗試使用一個導航屬性MatchGames來定義關系。 嘗試創建兩個單獨的導航屬性,如下所示。

public class Team
{
    public int Id { get; set; }
    public string TeamName { get; set; }
    public List<Match> HomeMatches { get; set; }
    public List<Match> AwayMatches { get; set; }
}

public class MatchGame
{
    public int Id { get; set; }
    public int HomeTeamId { get; set; }
    public Team HomeTeam { get; set; }
    public int AwayTeamId { get; set; }
    public Team AwayTeam { get; set; }
}

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<MatchGame>(entity =>
    {
        entity.HasOne(m => m.HomeTeam)
           .WithMany(t => t.HomeMatches)
           .HasForeignKey(m => m.HomeTeamId)
           .IsRequired()
           .OnDelete(DeleteBehavior.Cascade);

        entity.HasOne(m => m.AwayTeam)
           .WithMany(t => t.AwayMatches)
           .HasForeignKey(m => m.AwayTeamId)
           .IsRequired()
           .OnDelete(DeleteBehavior.Cascade);
    });

}

廣告 2. 您需要在TeamName上創建唯一索引:

modelBuilder.Entity<Team>(e => e.HasIndex(t => t.TeamName).IsUnique());

您也可以考慮在 model 等中添加MaxLength屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM