标签:
现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键【实际上是一对零或者一对一】。
请注意:一对一的关系,在MS SQL Server中,技术上是不可能实现的,主要还是一对零或者一对一的关系。
想了解更多的实体关系,请看MSDN,这里面讲解的很详细。----->>>Entity Relationship。
一、使用数据注解特性,来配置一对一(一对零)的关系。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF5 { public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public virtual StudentAddress StudentAddress { get; set; } } }
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; namespace EF5 { public class StudentAddress { //ForeignKey属性里面的参数填写的是导航属性。 [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; } } }
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF5 { public class DbContextClass:DbContext { public DbContextClass() : base("ConnectionString") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>()); } public DbSet<Student> Students { get; set; } public DbSet<StudentAddress> StudentAddresses { get; set; } } }
得到的数据库:
请注意,在上面的代码中,Student实体中,我没有做任何事情,然后Code-First默认约定,就将StudentID作为表的主键,然后在StudentAddress实体中,我特别指定了Key和ForeignKey特性,为了标注StudentId既是主键又是外键。在ForeignKey特性中,我指定了Student实体参数,所以就构成了一对一的关系。
当然我们可以使用Fluent API来配置一对一的关系:
使用Fluent APi来配置一对一(一对零)的关系
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF5 { public class DbContextClass:DbContext { public DbContextClass() : base("ConnectionString") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>()); } public DbSet<Student> Students { get; set; } public DbSet<StudentAddress> StudentAddresses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置表的主键 modelBuilder.Entity<StudentAddress>().HasKey(s => s.StudentID); //配置表的外键 modelBuilder.Entity<StudentAddress>().HasRequired(s => s.Student).WithOptional(p=>p.StudentAddress); base.OnModelCreating(modelBuilder); } } }
请注意:下面的代码,写法有错误,弄反了!!!
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EF5 { public class DbContextClass:DbContext { public DbContextClass() : base("ConnectionString") { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DbContextClass>()); } public DbSet<Student> Students { get; set; } public DbSet<StudentAddress> StudentAddresses { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //配置表的主键 modelBuilder.Entity<StudentAddress>().HasKey(s => s.StudentID); //配置表的外键 // modelBuilder.Entity<StudentAddress>().HasRequired(s => s.Student).WithOptional(p=>p.StudentAddress); modelBuilder.Entity<StudentAddress>().HasOptional(s => s.Student).WithRequired(p => p.StudentAddress); base.OnModelCreating(modelBuilder); } } }
这样得到的数据库是:
后面的一节中将学到,怎么配置一对多的关系。
附上系列目录:
Configure One-to-One(配置一对一关系)【Code-First系列】
标签:
原文地址:http://www.cnblogs.com/caofangsheng/p/5042843.html