【EntityFramework-5】表之間的關系

1. 基本引用模式:

this.Has****** (p=>p.AAA).With******() // ******有這幾個可選值:

  • Optional 可選(0或1個)
  • Required有且只有一個(1個)
  • Many(多個)

2. 一對多關系配置:

基本的插入查詢(建立好外鍵約束):

 public class Student
    {
        public long ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public virtual Class cls { get; set; }
        public long classId { get; set; }
    }
    public class Class
    {
        public long ID { get; set; }
        public string Name { get; set; }
    }

插入數(shù)據(jù):

using (TestDBContent tdc = new TestDBContent())
{
    Class cls = new Class() { Name="測試1班"};
    tdc.Classes.Add(cls);
    Student stu = new Student() { 
    Age=18,
    cls=cls,
    Name="風雪幻林"
    };
    tdc.students.Add(stu);
    tdc.SaveChanges();
}
2.1 不要設計雙向關系:
public class Class
{
    public long ID { get; set; }
    public string Name { get; set; }
    public ICollection<Student> students { get; set; }
}

查詢數(shù)據(jù):

Class clz = tdc.Classes.First();
var stus = tdc.students.Where(i => i.classId == clz.ID);
foreach (var item in stus)
{
    Console.WriteLine(item.Name);
}
2.2 通過Fluent API做配置:
  • 在一對多的表中(多的一端做配置)
    this. HasRequired(s=> s.Class).WithMany() .HasForeignKey(s => s.ClassId)
  • 找不到 Class_Id 字段
    需要在 ClassConfig 中再反向配置一遍

3. 多對多關系配置:

  • 推薦配置:
 public class Student
    {
        public Student()
        {
            teachers = new List<Teacher>();
        }
        public long ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public virtual ICollection<Teacher> teachers { get; set; }
    }
    public class Teacher
    {
        public Teacher()
        {
            students = new List<Student>();
        }
        public long ID { get; set; }
        public string Name { get; set; }
        public virtual ICollection<Student> students { get; set; }
    }
  • Fluent API 多對多的配置:
  • 在其中一端配置
public class TeacherConfig : EntityTypeConfiguration<Teacher>
{
    public TeacherConfig()
    {
        this.ToTable("t_class");
        this.Property(e => e.Name).HasMaxLength(30).IsRequired();
        this.HasMany(e=>e.students).WithMany(i=>i.teachers).Map(m=>m.ToTable("t_teacherstudent").MapLeftKey("techerId").MapRightKey("studentId"));
    }
}
public class StudentConfig : EntityTypeConfiguration<Student>
{
    public StudentConfig()
    {
        this.ToTable("t_student");           
    }
}
  • 調(diào)用:
static void Main(string[] args)
{
    Teacher t = new Teacher() { Name = "語文老師" };
    Teacher t2 = new Teacher() { Name = "數(shù)學老師" };
    Student s = new Student() { Name = "張三", Age = 21 };
    Student s2 = new Student() { Name = "李四", Age = 22 };
    using (TestDBContent tdb =new TestDBContent ())
    {
        t.students.Add(s);
        t.students.Add(s2);
        t2.students.Add(s);
        t2.students.Add(s2);
        tdb.teachers.Add(t);
        tdb.teachers.Add(t2);
        tdb.SaveChanges();
    }
    Console.WriteLine("ok");
    Console.ReadKey();
}
  • 多對多的關系:
  • 移除關系: t.Students.Remove(t.Students.First())
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,728評論 18 399
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 11,119評論 0 23
  • 一. Java基礎部分.................................................
    wy_sure閱讀 4,012評論 0 11
  • --可是戰(zhàn)爭不光掠奪,它也給予。 之前就聽說這本書很暢銷,前幾天機緣巧合買到了紙質(zhì)版,也許是緣分。 書中講的是一個...
    染谷紫苑閱讀 254評論 0 0
  • 文/粒粒 我跟先生說:“廚房太小了,我們需要很大的廚房。”他說:“很好的想法,那你要加緊賺錢! ” 我之所以對大廚...
    粒粒西游記閱讀 441評論 2 3

友情鏈接更多精彩內(nèi)容