Asp.net-Mvc

在Entity Framework Code First中為同一個表定義多個外鍵

  • February 17, 2015

我的 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 AnnotationsFluent 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);
}

引用自:https://stackoverflow.com/questions/28570916