2012-04-20 101 views
2

我看着this SO問題。實體框架5(預發佈)關於實體關係的新手問題等

我想在EF 5中做類似的事情。我沒有看到ForeignKey屬性,而是EF5中的關聯屬性。

此外,有人可以解釋這是什麼呢/是指:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Match>() 
       .HasRequired(m => m.HomeTeam) 
       .WithMany(t => t.HomeMatches) 
       .HasForeignKey(m => m.HomeTeamId) 
       .WillCascadeOnDelete(false); 

    modelBuilder.Entity<Match>() 
       .HasRequired(m => m.GuestTeam) 
       .WithMany(t => t.AwayMatches) 
       .HasForeignKey(m => m.GuestTeamId) 
       .WillCascadeOnDelete(false); 
} 

這樣的解釋:

主鍵默認約定映射。團隊必須有兩個 收集的比賽。您不能有兩個FK參考 單個集合。匹配被映射而沒有級聯刪除,因爲它沒有 在這些自引用多對多的工作。

我想要做的是非常相似的鏈接中的例子,但我不知道:

  1. 當我需要修改的DbContext
  2. 當主鍵將鏈接到每個其他
  3. 當我需要明確地使用公會創建關係

任何解釋表示讚賞。

回答

1

好吧,所以......我無法回答EF測試版中的ForeignKey屬性問題,因爲我還沒有機會查看它。

但是......

modelBuilder.Entity<Match>() - Take the entity "Match" and perform following operations on it 
.HasRequired(m => m.HomeTeam) - The entity needs to have a non-null navigation HomeTeam... 
.WithMany(t => t.HomeMatches) - ... which has a subset of Matches by navigation HomeMatches 
.HasForeignKey(m => m.HomeTeamId) ... and the associating foreign key is HomeTeamId on Match 
.WillCascadeOnDelete(false); ... and don't cascade when the entity is deleted. 

這是LINQ的美,它不是沒有自我記錄的更頻繁。現在

,爲您的三個問題......

  1. 只有修改的DbContext當你改變模型的關係或添加/刪除的實體。如果你正在添加,你需要做一個 public DbSet Entities {get;組; 並刪除它,如果刪除等

  2. 主鍵不鏈接到對方。外鍵鏈接到主鍵。按照慣例,如果你有一個ProjectId,一個名爲Project的導航對象和一個名爲Id的名爲Project的實體,它會自動將ProjectId從第一個實體映射到Project實體的Id,並將Project實體作爲導航項目當您通過EF從數據庫獲取數據時的第一個實體:

  3. 僅當您需要基於非約定的關係時。也就是說,例如,您的主鍵沿着「tblId」或「ParentId」的行而不是「Id」和「ProjectId」。或者您需要針對某些項目採取不同的行爲,例如僅爲選擇實體級聯刪除。

1

在EF 5,如果你正在使用的遷移,你可以改變遷移代碼不實現級聯刪除:

CreateTable(
      "dbo.Match", 
      c => new 
       { 
        MatchId = c.Long(nullable: false, identity: true), 
        Description = c.String(), 
        HomeTeamId = c.Long(nullable: false), 
       }) 
      .PrimaryKey(t => t.MatchId) 
      .ForeignKey("dbo.Team", t => t.HomeTeamId, cascadeDelete: false)     
      .Index(t => t.MatchId) 
      .Index(t => t.HomeTeamId); 

    } 

或類似的東西。