通過一些嘗試,終於把設置這種特性不生效的原因給理出來了,,本人Model 引用了一個基類層,基類層是基礎EF特性來做的,然而我更新了Model 的EF框架 層之後,導致兩個版本框架不一致,最終出現了我下麵說到的InverseProperty 不生效問題一個實體多個引用的情況我們來考慮一下下麵的情況:...
通過一些嘗試,終於把設置這種特性不生效的原因給理出來了,,本人Model 引用了一個基類層,基類層是基礎EF特性來做的,然而我更新了Model 的EF框架 層之後,導致兩個版本框架不一致,最終出現了我下麵說到的InverseProperty 不生效問題
一個實體多個引用的情況
我們來考慮一下下麵的情況:
1 public class Lodging 2 { 3 public int LodgingId { get; set; } 4 public string Name { get; set; } 5 public string Owner { get; set; } 6 public bool IsResort { get; set; } 7 public decimal MilesFromNearestAirport { get; set; } 8 public Destination Target { get; set; } 9 //第一聯繫人 10 public Person PrimaryContact { get; set; } 11 //第二聯繫人 12 public Person SecondaryContact { get; set; } 13 } 14 15 public class Person 16 { 17 public int PersonID { get; set; } 18 public string FirstName { get; set; } 19 public string LastName { get; set; } 20 public List<Lodging> PrimaryContactFor { get; set; } 21 public List<Lodging> SecondaryContactFor { get; set; } 22 }View Code
Lodging(旅店)有兩個對Person表的引用,分別是PrimaryContact與SecondaryContact,同時,在Person表中也有對這兩個聯繫人的導航:PrimaryContactFor與SecondaryContactFor。
看看Code First預設會生成怎樣的資料庫
Lodging(旅店)有兩個對Person表的引用,分別是PrimaryContact與SecondaryContact,同時,在Person表中也有對這兩個聯繫人的導航:PrimaryContactFor與SecondaryContactFor。
看看Code First預設會生成怎樣的資料庫
天哪,竟然生成了四個外鍵。因為有兩套類型一樣的導航屬性與引用屬性,Code First無法確定它們之間的對應關係,就單獨為每個屬性都創建了一個關係。這肯定不是我們所期望的,為了讓Code First知道它們之間的對應關係,在這裡要用到逆導航屬性來解決。
使用Data Annotations:但是!!!!!,我用下麵的第一種方法,未成功,具體原因不明,希望有知道的可以給我一些指點,最終用的第二種方法來時間的關係
1 //第一聯繫人 2 [InverseProperty("PrimaryContactFor")] 3 public Person PrimaryContact { get; set; } 4 //第二聯繫人 5 [InverseProperty("SecondaryContactFor")] 6 public Person SecondaryContact { get; set; }View Code
或使用Fluent API:
1 modelBuilder.Entity<Lodging>().HasOptional(l => l.PrimaryContact).WithMany(p => p.PrimaryContactFor); 2 modelBuilder.Entity<Lodging>().HasOptional(l=>l.SecondaryContact).WithMany(p=>p.SecondaryContactFor);View Code
再重新生成資料庫,結果如圖: