[英]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方法總是必須用單個對象調用。
雖然他們都建立了一個關聯,但他們提供的結果略有不同,並且有不同的要求:
如果它是一個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.