簡體   English   中英

如何使用 EF Code First 來聲明一對多關系?

[英]How can I use EF Code First to declare a one-to-many relationship?

我正在嘗試使用 Entity Framework fluent API在兩個 poco 之間定義簡單的一對多關系

~ Team ~
public int TeamId { get; set; }
public ICollection<User> TeamMembers { get; set; } // All the team players. Two way nav.
public Player CreatedBy { get; set; } // Which player created this team. One way navigation.
                                      // Optional. Not all players create a team.

~ Player ~
public int PlayerId { get; set; }
public Team Team { get; set; } // The other side of the TeamMembers navigation.

筆記:

  • 球員不必在一個團隊中。 (未分配/放棄的球員)。
  • 一支球隊可能沒有球員(他們都離開了/退出了)。

我認為我得到的最接近的是這樣的:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Team>()
        .HasOptional(x => x.TeamMembers)
        .WithMany()
        .WillCascadeOnDelete(false);
}

這不起作用,我不確定如何定義其他導航。

我認為這個對象模型就是你要找的:

public class Team
{    
    public int TeamId { get; set; }
    public ICollection<Player> TeamMembers { get; set; } 
    public Player CreatedBy { get; set; } 
}

public class Player
{
    public int PlayerId { get; set; }
    public Team Team { get; set; } 
}       

public class Context : DbContext
{
    public DbSet<Player> Players { get; set; }
    public DbSet<Team> Teams { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Player>()
                    .HasOptional(p => p.Team)
                    .WithMany(t => t.TeamMembers)
                    .Map(c => c.MapKey("TeamId"));

        // Or alternatively you could start from the Team object:
        modelBuilder.Entity<Team>()
                    .HasMany(t => t.TeamMembers)
                    .WithOptional(p => p.Team)
                    .Map(c => c.MapKey("TeamId"));
    }
}

順便說一句,您使用的以下流暢 API 代碼不正確:

...HasOptional(x => x.TeamMembers)

因為 TeamMembers 是一個集合,不能被HasOptional方法使用,而HasOptional方法總是必須用單個對象調用。

更新 - HasRequired 與 HasOptional:

雖然他們都建立了一個關聯,但他們提供的結果略有不同,並且有不同的要求:

  • 如果它是一個FK關聯(FK的財產暴露在依賴對象上),那么它使用HasRequired或代碼第一次將拋出在使用HasOptional和非可空類型時,必須是可空類型。

  • 使用HasRequired方法時,Code First 將自動切換級聯刪除。

  • 另一個區別是 EF 運行時在刪除時的行為。 考慮一個場景,我們想要刪除主體對象(例如Team ),而它有一個從屬對象(例如Player ),並且級聯刪除被關閉。 使用HasOptional EF 運行時將默默地將依賴 FK 列更新為 null 而使用HasRequired EF 將拋出並要求您顯式刪除依賴對象或將其與另一個主體對象相關聯(如果您想嘗試此操作,您應該注意主體和從屬對象都必須已經在上下文中加載,以便 EF 可以跟蹤它們)。

只需執行以下操作,我就能夠使其自動工作:

 public class Team {
    public int TeamId { get; set; }
    ...
    public virtual ICollection<Player> Players { get; set; }
}

但是,當您說“不起作用”時,您必須更具體地說明您的確切含義。 什么不起作用,究竟是什么? 您是否收到錯誤消息? 如果是,那是什么? Player 對象的 Team 屬性是否總是返回 null?

暫無
暫無

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

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