你的位置:首页 > ASP.net教程

[ASP.net教程]Configure One


现在,开始学习怎么配置一对一的关系,众所周知,一对一的关系是:一个表中的主键,在另外一个表中,同时是主键和外键【实际上是一对零或者一对一】。

请注意:一对一的关系,在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);    }      }}

这样得到的数据库是:

 

后面的一节中将学到,怎么配置一对多的关系。

 

 

附上系列目录:

  • 什么是Code First
  • 简单的Code First例子
  • Code-First 约定
  • DB Initialization(数据库初始化)
  • Inheritance Strategy(继承策略)
  • Configure Domain Classes(配置领域类)
  • DataAnnotations(数据注解)
  • Fluent API
  • Configure One-to-One(配置一对一关系)
  • Configure One-to-Many(配置一对多关系)
  • Configure Many-to-Many(配置多对多关系)
  • Move Configurations(数据迁移)
  • DB Initialization Strategy(数据库初始化策略)