1對一、1對0 的關係數據庫
例如:Entity1與零個或一個Entity2的實例有關係ide
public class Student { public Student() { } public int StudentId { get; set; } public string StudentName { get; set; } public virtual StudentAddress Address { get; set; } } public class StudentAddress { public int StudentAddressId { get; set; } public string Address1 { get; set; } public string Address2 { get; set; } public string City { get; set; } public int Zipcode { get; set; } public string State { get; set; } public string Country { get; set; } public virtual Student Student { get; set; } }
在關係型數據庫(如SQL Server)中,1對0或1的關係是一個表的主鍵將是另外一個關係表的主鍵或外鍵ui
所以,建立Student表的時候設置StudentId爲主鍵,StudentAddress表的StudentAddressId既是主鍵有事外鍵spa
在Code First默認約定中,StudentId屬性默認爲Student的主鍵,StudentAddressId默認爲StudentAddress的主鍵,所以,咱們只須要配置StudentAddressId又爲外鍵就行code
經過以下配置便可blog
public class Student { public Student() { } public int StudentId { get; set; } public string StudentName { get; set; } public virtual StudentAddress Address { get; set; } } public class StudentAddress { [ForeignKey("Student")] public int StudentAddressId { get; set; } public string Address1 { get; set; } public string Address2 { get; set; } public string City { get; set; } public int Zipcode { get; set; } public string State { get; set; } public string Country { get; set; } public virtual Student Student { get; set; } }
public class Student { public Student() { } public int StudentId { get; set; } public string StudentName { get; set; } public virtual StudentAddress Address { get; set; } } public class StudentAddress { [Key, ForeignKey("Student")] public int StudentId { get; set; } public string Address1 { get; set; } public string Address2 { get; set; } public string City { get; set; } public int Zipcode { get; set; } public string State { get; set; } public string Country { get; set; } public virtual Student Student { get; set; } }
Fluent API配置ip
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Configure Student & StudentAddress entity modelBuilder.Entity<Student>() .HasOptional(s => s.Address) // Mark Address property optional in Student entity .WithRequired(ad => ad.Student); // mark Student property as required in StudentAddress entity. Cannot save StudentAddress without Student }
上面的配置說明:StudentAddress在Student中的導航屬性是可選的(沒有StudentAddress也能夠保存Student),Student在StudentAddress中的導航屬性是必須的(沒有Student的話StudentAddress保存不了),StudentAddressId做爲外鍵ci
public class Student { public Student() { } public int StudentId { get; set; } public string StudentName { get; set; } public virtual StudentAddress Address { get; set; } } public class StudentAddress { public int StudentId { get; set; } public string Address1 { get; set; } public string Address2 { get; set; } public string City { get; set; } public int Zipcode { get; set; } public string State { get; set; } public string Country { get; set; } public virtual Student Student { get; set; } }
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Configure StudentId as PK for StudentAddress modelBuilder.Entity<StudentAddress>() .HasKey(e => e.StudentId); // Configure StudentId as FK for StudentAddress modelBuilder.Entity<Student>() .HasOptional(s => s.Address) .WithRequired(ad => ad.StudentId); }
一對一的關係get
一對一在MS SQL Server中在技術上是不可能的,它老是1對0或1的關係,EF是在實體上表現爲一對一的關係,而不是在數據庫中string
protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Configure StudentId as PK for StudentAddress modelBuilder.Entity<StudentAddress>() .HasKey(e => e.StudentId); // Configure StudentId as FK for StudentAddress modelBuilder.Entity<Student>() .HasRequired(s => s.Address) .WithRequiredPrincipal(ad => ad.Student); }
modelBuilder.Entity<Student>().HasRequired(s => s.Address)代表Address屬性是必須的
.WithRequiredPrincipal(ad => ad.Student)
注:主實體是Student,依賴實體是StudentAddress