我们可以定义一个继承自EntityTypeConfiguration<>泛型类的类来定义domain中每个类的数据库配置,我们在这个自定义类的构造函数中使用我们上次提到的那些方法配置数据库的映射。
实体类映射中,关系的映射配置在关系的两端都可以配置。例如,用户信息与登录信息的 一对多 关系可以在用户信息端配置:
HasMany(m => m.LoginLogs).WithRequired(n => n.Member);
等效于在登录日志信息端配置:
HasRequired(m => m.Member).WithMany(n => n.LoginLogs);
但是,如果所有的关系映射都在作为主体的用户信息端进行配置,势必造成用户信息端配置的臃肿与职责不明。所以,为了保持各个实体类型的职责单一,实体关系推荐在关系的非主体端进行映射。
用户信息映射类,用户信息是关系的主体,所有的关系都不在此映射类中进行配置
namespace GMF.Demo.Core.Data.Configurations { public class MemberConfiguration : EntityTypeConfiguration<Member> { } }
用户扩展信息映射类,配置用户扩展信息与用户信息的 0:1 关系
namespace GMF.Demo.Core.Data.Configurations { public class MemberExtendConfiguration : EntityTypeConfiguration<MemberExtend> { public MemberExtendConfiguration() { HasRequired(m => m.Member).WithOptional(n => n.Extend); } } }
暴力处理:直接删除掉后重新生成
namespace Portal { public class PortalContext : DbContext { static PortalContext() { Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>()); } public DbSet<Province> Provinces { get; set; } public DbSet<Category> Categories { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new ProvinceMap()); modelBuilder.Configurations.Add(new CategoryMap()); } } }
DropCreateDatabaseIfModelChanges<PortalContext>()太暴力了
改变原来类的结构后数据库将发生错误提示
1.第一次建立数据库迁移通过nugget来进行编辑
Package Manager Console-》Enable-Migrations -StartUpProjectName CodeFirst-》执行“Add-Migration FirstMigration”命令-》
执行“Update-Database”命令,更新数据库架构
你的项目中将自动生成一个名为”Migrations“的文件夹,里面包含两个文件: Configuration.cs和201308211510117_InitialCreate.cs(201308211510117是时间戳)。
Configuration.cs:是迁移配置代码,一般我们不需要修改。
namespace CodeFirst.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration<CodeFirst.OrderContext> { public Configuration() { AutomaticMigrationsEnabled = true; } protected override void Seed(CodeFirst.OrderContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet<T>.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = "Andrew Peters" }, // new Person { FullName = "Brice Lambson" }, // new Person { FullName = "Rowan Miller" } // ); // } }
201308211510117_InitialCreate.cs:以代码的形式记录了本地数据库的表结构定义。
有以下两个参数可以对自动迁移进行设置:
1. AutomaticMigrationsEnabled:获取或设置 指示迁移数据库时是否可使用自动迁移的值。
2. AutomaticMigrationDataLossAllowed:获取或设置 指示是否可接受自动迁移期间的数据丢失的值。如果设置为false,则将在数据丢失可能作为自动迁移一部分出现时引发异常。