Asp.net-Mvc
在Entity Framework Code First中為同一個表定義多個外鍵
我的 MVC 應用程序中有兩個實體,並使用 Entity Framework 6 Code First 方法填充了數據庫。Student 實體中有兩個城市 id;其中一個用於 BirthCity,另一個用於 WorkingCity。當我如上所述定義外鍵時,遷移後會在 Student 表中創建一個名為 City_ID 的額外列。是否有錯誤或如何定義這些 FK?提前致謝。
學生:
public class Student { public int ID { get; set; } public string Name { get; set; } public string Surname { get; set; } public int BirthCityID { get; set; } public int LivingCityID { get; set; } [ForeignKey("BirthCityID")] public virtual City BirthCity { get; set; } [ForeignKey("LivingCityID")] public virtual City LivingCity { get; set; } }城市:
public class City { public int ID { get; set; } public string CityName { get; set; } public virtual ICollection<Student> Students { get; set; } }
要實現您想要的,您需要提供一些額外的配置。Code First 約定可以辨識雙向關係,但當兩個實體之間存在多個雙向關係時則不能。您可以添加配置(使用Data Annotations或Fluent API)來呈現此資訊給模型建造者。使用數據註釋,您將使用一個名為
InverseProperty. 使用 Fluent API,您將使用Has/With方法的組合來指定這些關係的正確結束。使用數據註釋可能是這樣的:
public class Student { public int ID { get; set; } public string Name { get; set; } public string Surname { get; set; } public int BirthCityID { get; set; } public int LivingCityID { get; set; } [ForeignKey("BirthCityID")] [InverseProperty("Students")] public virtual City BirthCity { get; set; } [ForeignKey("LivingCityID")] public virtual City LivingCity { get; set; } }通過這種方式,您可以明確指定要將
BirthCity導航屬性與Students關係另一端的導航屬性相關聯。使用Fluent Api可能是這樣的:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Student>().HasRequired(m => m.BirthCity) .WithMany(m => m.Students).HasForeignKey(m=>m.BirthCityId); modelBuilder.Entity<Student>().HasRequired(m => m.LivingCity) .WithMany().HasForeignKey(m=>m.LivingCityId); }使用最後一個解決方案,您不需要使用任何屬性。
現在,@ChristPratt 在
Student你的City班級中為每個關係收集一個集合的建議真的很有用。如果你這樣做,那麼使用數據註釋的配置可能是這樣的:public class Student { public int ID { get; set; } public string Name { get; set; } public string Surname { get; set; } public int BirthCityID { get; set; } public int LivingCityID { get; set; } [ForeignKey("BirthCityID")] [InverseProperty("BirthCityStudents")] public virtual City BirthCity { get; set; } [ForeignKey("LivingCityID")] [InverseProperty("LivingCityStudents")] public virtual City LivingCity { get; set; } }或者按照相同的想法使用Fluent Api:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Student>().HasRequired(m => m.BirthCity) .WithMany(m => m.BirthCityStudents).HasForeignKey(m=>m.BirthCityId); modelBuilder.Entity<Student>().HasRequired(m => m.LivingCity) .WithMany(m => m.LivingCityStudents).HasForeignKey(m=>m.LivingCityId); }