19.翻译系列:EF 6中定义自定义的约定【EF 6 Code-First约定】
程序员文章站
2022-06-18 10:10:19
原文链接:https://www.entityframeworktutorial.net/entityframework6/custom-conventions-codefirst.aspx EF 6 Code-First系列文章目录: 1 翻译系列:什么是Code First(EF 6 Code ......
原文链接:
ef 6 code-first系列文章目录:
- 1 翻译系列:什么是code first(ef 6 code first 系列)
- 2.翻译系列:为ef code-first设置开发环境(ef 6 code-first系列)
- 3.翻译系列:ef code-first 示例(ef 6 code-first系列)
- 4.翻译系列:ef 6 code-first默认约定(ef 6 code-first系列)
- 5.翻译系列:ef 6中数据库的初始化(ef 6 code-first 系列)
- 6.翻译系列:ef 6 code-first中数据库初始化策略(ef 6 code-first系列
- 7.翻译系列:ef 6中的继承策略(ef 6 code-first 系列)
- 8.翻译系列: ef 6中配置领域类(ef 6 code-first 系列)
- 9.翻译系列:ef 6以及ef core中的数据注解特性(ef 6 code-first系列)
- 9.1 翻译系列:数据注解特性之----table【ef 6 code-first 系列】
- 9.2 翻译系列:数据注解特性之---column【ef 6 code first系列】
- 9.3 翻译系列:数据注解特性之key【ef 6 code-first 系列】
- 9.4 翻译系列:ef 6以及 ef core中的notmapped特性(ef 6 code-first系列)
- 9.5 翻译系列:数据注解之foreignkey特性【ef 6 code-first系列】
- 9.6 翻译系列:数据注解之index特性【ef 6 code-first系列】
- 9.7 翻译系列:ef数据注解特性之--inverseproperty【ef 6 code-first系列】
- 9.8 翻译系列:数据注解特性之--required 【ef 6 code-first系列】
- 9.9 翻译系列:数据注解特性之--maxlength 【ef 6 code-first系列】
- 9.10 翻译系列:ef数据注解特性之stringlength【ef 6 code-first系列】
- 9.11 翻译系列:数据注解特性之--timestamp【ef 6 code-first系列】
- 9.12 翻译系列:数据注解特性之concurrencycheck【ef 6 code-first系列】
- 10.翻译系列:ef 6中的fluent api配置【ef 6 code-first系列】
- 10.1.翻译系列:ef 6中的实体映射【ef 6 code-first系列】
- 10.2.翻译系列:使用fluent api进行属性映射【ef 6 code-first】
- 11.翻译系列:在ef 6中配置一对零或者一对一的关系【ef 6 code-first系列】
- 12.翻译系列:ef 6 中配置一对多的关系【ef 6 code-first系列】
- 13.翻译系列:code-first方式配置多对多关系【ef 6 code-first系列】
- 14.翻译系列:从已经存在的数据库中生成上下文类和实体类【ef 6 code-first系列】
- 15.翻译系列:ef 6中的级联删除【ef 6 code-first 系列】
- 16.翻译系列:ef 6 code -first中使用存储过程【ef 6 code-first系列】
- 17.翻译系列:将fluent api的配置迁移到单独的类中【ef 6 code-first系列】
- 18.翻译系列:ef 6 code-first 中的seed data(种子数据或原始测试数据)【ef 6 code-first系列】
- 19.翻译系列:ef 6中定义自定义的约定【ef 6 code-first约定】
- 20.翻译系列:code-first中的数据库迁移技术【ef 6 code-first系列】
- 20.1翻译系列:ef 6中自动数据迁移技术【ef 6 code-first系列】
- 20.2.翻译系列:ef 6中基于代码的数据库迁移技术【ef 6 code-first系列】
- 21.翻译系列:entity framework 6 power tools【ef 6 code-first系列】
在前面的章节中,你以及学习了code-first默认的约定。ef 6同样也让你自己定义自定义的约定,然后你的实体就会遵循这个自定义的约定的行为。
这里有两种类型的约定:配置约定(configuration conventions)和模型约定(model conventions).
配置约定
配置约定就是不重写fluent api提供实体的默认的行为,给实体进行配置。你可以在onmodelcreating方法中定义配置约定,还可以像fluent api配置普通的实体映射那样,在自定义的类中配置约定。
例如,如果你想要给属性名称为{实体名称}_id的属性,配置主键,可以像下面这样:
protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder .properties() .where(p => p.name == p.declaringtype.name + "_id") .configure(p => p.iskey()); base.onmodelcreating(modelbuilder); }
同样你可以定义数据类型的大小的约定【data type of size】
下面的代码,为string类型的属性定义了一个约定。它将会创建nvarchar类型的列,大小是50。
protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder .properties() .where(p => p.propertytype.name == "string") .configure(p => p.hasmaxlength(50)); base.onmodelcreating(modelbuilder); }
当然,你可以在单独的类中,定义这些约定,这个自定义的类需要继承自convention类,例如:
public class pkconvention : convention { public pkconvention() { .properties() .where(p => p.name == p.declaringtype.name + "_id") .configure(p => p.iskey()); } }
添加完自定义的类,然后在onmodelcreating方法中这样用:
protected override void onmodelcreating(dbmodelbuilder modelbuilder) { modelbuilder.conventions.add<pkconvention>(); }
模型约定
模型约定是基于模型元数据的。这里有关于csdl和ssdl的约定,创建一个类,实现csdl约定中的iconceptualmodelconvention 接口,或者实现ssdl约定中的istoremodelconvention
接口。
想要了解更多ef 6 自定义约定相关的,可以看看这篇文章: custom convention in ef 6 。