先从现有数据库获取代码: 我们创建模型的时候选择Code First就可以了
public ModelStudent() : base("name=ModelStudent") { } public virtual DbSetCourses { get; set; } public virtual DbSet Standards { get; set; } public virtual DbSet Students { get; set; } public virtual DbSet StudentAddresses { get; set; } public virtual DbSet sysdiagrams { get; set; } public virtual DbSet Teachers { get; set; } public virtual DbSet View_StudentCourse { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity () .Property(e => e.CourseName) .IsUnicode(false); modelBuilder.Entity () .HasMany(e => e.Students) .WithMany(e => e.Courses) .Map(m => m.ToTable("StudentCourse").MapLeftKey("CourseId").MapRightKey("StudentId")); modelBuilder.Entity () .Property(e => e.StandardName) .IsUnicode(false); modelBuilder.Entity () .Property(e => e.Description) .IsUnicode(false); modelBuilder.Entity () .HasMany(e => e.Students) .WithOptional(e => e.Standard) .WillCascadeOnDelete(); modelBuilder.Entity () .HasMany(e => e.Teachers) .WithOptional(e => e.Standard) .WillCascadeOnDelete(); modelBuilder.Entity () .Property(e => e.StudentName) .IsUnicode(false); modelBuilder.Entity () .Property(e => e.RowVersion) .IsFixedLength(); modelBuilder.Entity () .HasOptional(e => e.StudentAddress) .WithRequired(e => e.Student) .WillCascadeOnDelete(); modelBuilder.Entity () .Property(e => e.Address1) .IsUnicode(false); modelBuilder.Entity () .Property(e => e.Address2) .IsUnicode(false); modelBuilder.Entity () .Property(e => e.City) .IsUnicode(false); modelBuilder.Entity () .Property(e => e.State) .IsUnicode(false); modelBuilder.Entity () .Property(e => e.TeacherName) .IsUnicode(false); modelBuilder.Entity () .HasMany(e => e.Courses) .WithOptional(e => e.Teacher) .WillCascadeOnDelete(); modelBuilder.Entity () .Property(e => e.StudentName) .IsUnicode(false); modelBuilder.Entity () .Property(e => e.CourseName) .IsUnicode(false); }
实体框架中的级联删除代码优先:
删除主体记录时,级联删除会自动删除相关记录或将空值设置为foreignkey属性。
对于所有类型的关系(如一对一,一对多和多对多),实体框架中默认启用级联删除。
一对一级联删除:
一对多级联删除:
关闭级联删除:
在Code-First中移动配置以分隔类:
Code-First使您可以将与一个域类有关的所有配置移动到一个单独的类。
可以将与学生实体有关的所有配置移动到从中派生出的单独的类EntityTypeConfiguration<TEntity>
。
代码优先的数据库初始化策略:
有四种不同的数据库初始化策略:
- CreateDatabaseIfNotExists:这是默认的初始值设定项。如果每个配置都不存在,它将创建数据库。但是,如果更改模型类,然后使用此初始化程序运行应用程序,则会引发异常。
- DropCreateDatabaseIfModelChanges:如果您的模型类(实体类)已被更改,此初始化程序将删除现有的数据库并创建一个新的数据库。所以,当模型类更改时,您不必担心维护数据库模式。
- DropCreateDatabaseAlways:这个初始化器在每次运行应用程序时都会删除一个现有的数据库,而不管你的模型类是否已经改变。当你想要新的数据库,每次运行应用程序,就像在开发应用程序时一样,这将会很有用。
- 自定义数据库初始化程序:如果上述任何一个不满足您的要求,或者您想要使用上述初始化程序来初始化数据库,您也可以创建自己的自定义初始化程序。
要使用上述DB初始化策略之一,必须在Context类中使用Database类设置DB初始值设定项,如下所示:
在Code-First中关闭数据库初始化程序:
代码优先种子数据库:
可以在数据库初始化过程中将数据插入到数据库表中。如果你想为你的应用程序提供一些测试数据或者为你的应用程序提供一些默认的主数据,这将是非常重要的。
代码优先到这里就完了。