EF中的约定

优先级:Fluent API >数据注释>约定

CodeFirst约定

主键约定

如果类的属性名为"ID"(不区分大小写)或类名的后面跟有"ID",则code First会推断该属性是主键,如果主键属性的类型为数值或 GUID,则将其配置为标识列。

关系约定

Code First 根据针对类型定义的导航属性来推断关系。除导航属性外,建议还要包括表示依赖对象的类型的外键属性。任何数据类型与主体主键属性相同、遵循以下一种格式的属性都表示关系的外键:“<导航属性名称><主体主键属性>”、“<主体类名><主键属性名称>”或“<主体主键属性名称>”。如果找到多个匹配项,则优先级符合上面列出的顺序。外键检测不区分大小写。在检测外键属性时,Code First 基于外键的可空性推断关系的多重性。如果属性可以为 Null,则将关系注册为可选关系;否则,将关系注册为必需关系。

如果依赖实体上的外键不能为 Null,则 Code First 对关系设置级联删除。如果依赖实体上的外键可以为 Null,则 Code First 不对关系设置级联删除,并且在删除主体时,会将该外键设置为 Null。通过使用 Fluent API,可以覆盖由约定检测的多重性和级联删除行为。

复杂类型约定

当 Code First 发现无法推断主键以及未通过数据注释或 Fluent API 注册主键的类时,类型会自动注册为复杂类型。复杂类型检测还要求类型不具有引用实体类型的属性,并且未被其他类型的集合属性引用。对于以下类定义,Code First 推断 Details 是复杂类型,因为它没有主键。

public partial class OnsiteCourse : Course 
{ 
    public OnsiteCourse() 
    { 
        Details = new Details(); 
    } 
 
    public Details Details { get; set; } 
} 
 
public class Details 
{ 
    public System.DateTime Time { get; set; } 
    public string Location { get; set; } 
    public string Days { get; set; } 
}

移除约定

可以移除在 System.Data.Entity.ModelConfiguration.Conventions 命名空间中定义的任何约定。下面的示例移除 PluralizingTableNameConvention

public class SchoolEntities : DbContext 
{ 
     . . . 
 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    {   
  		modelBuilder.Conventions.Remove<PluralizingTableNameCon		vention>(); 			 	 
    } 
}
posted @ 2015-05-28 15:53  senki  阅读(318)  评论(0编辑  收藏  举报