EntityFramework配置二(Code First-数据库的初始化方式和EF的一些配置)
上一篇中我们根据模型直接生成了数据库,
1、如果实体类的属性改变了,再次运行会报错,这是因为我们没有配置任何数据库初始化的方式
Entity Framework通过Database.SetInitializer来指定需要的数据库初始化方式,配置在上下文类中,重写OnModelCreating中配置,Database.SetInitializer可指定的数据库共有3种:
a. CreateDatabaseIfNotExists
CreateDatabaseIfNotExists是Database.SetInitializer指定数据库的默认方式,用于当数据库不存在时,自动创建数据库。由于该方式是默认方式,所以可以不需要任何代码进行指定,当然也可以使用代码来明确的指定。
Database.SetInitializer(new CreateDatabaseIfNotExists<DataContext>());
b. DropCreateDatabaseWhenModelChanges
DropCreateDatabaseWhenModelChanges用于当数据模型发生改变时,先删除原数据库,后创建新的数据库。
Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DataContext>());
c. DropCreateDatabaseAlways
DropCreateDatabaseAlways用于每次均先删除原数据库再创建新的数据库,不管数据模型是否发生改变。
Database.SetInitializer(new DropCreateDatabaseAlways<DataContext>());
但是,在很多时候,我们希望即使在Entity Framework Code First与数据库不匹配时,宁可Entity Framework Code First报出数据库连接错误,而不希望对数据库进行任何的删除创建操作。Entity Framework Code First提供关闭数据库初始化操作:
Database.SetInitializer<DataContext>(null);
2、EF Code First 映射数据库的一些配置
a.禁用默认生成数据库表名复数形式
EF Code First根据实体模型类来生成数据库和表字段,我们前面有两个实体Student和Class,
我定义是的时候并不是服饰形式,而EF帮我们自动生成的数据库表名是复数形式的。
解决方案:数据库上下文类中重写DbContext的OnModelCreating方法配置禁用
b..禁用延迟加载(Lazy Loading)
在存在引用关系的两个实体类中,一个类的实例可以通过关联关系获取与之对应的另外一个类的一个或多个实例。在这种获取的时候,Entity Framework Code First提供了默认的延迟加载功能。一个类的实例,在需要使用另外一个类对应的实例时,可以直接读取在类中定义的关联属性,Entity Framework将自动到数据库中去读取返回需要的记录。当然这是延迟加载的好处,同样延迟加载也存在一些不好的地方。在Entity Framework通过延迟加载去读取关联记录时,可能执行过多的SQL语句,与实际所预想的不一致,从而影响代码的执行效率。
设置默认禁用延迟加载,在需要Entity Framework读取关联数据记录时采用显示加载。
c. 禁用关系数据的级联删除
在存在关联关系的数据记录间,当主表记录被删除时,自动删除从表中关联的记录。这个是关系数据库中大都存在的功能,包括MS SQL Server同样也提供了该功能。然而在实际的项目中,往往不想使用这种级联删除功能,在需要删除关联的记录时,也一样编写代码来进行删除。
Entity Framework Code First设置默认禁用关联数据的级联删除功能:
本文中有借鉴https://www.cnblogs.com/libingql/p/3351275.html
侵删