下面解释每个配置的作用

Table 用于指定生成表的表名、架构信息。

Column 用于指定生成数据表的列信息,如列名、数据类型、顺序等。

Key 用于指定任何名称的属性作为主键列并且默认将此列作为标识列(如果不想默认生成标识可以指定“DatabaseGenerated”属性的值为“None”),如果不指定此标记属性,将根据EF默认约定创建主键。如上代码指定“No”为“Employee”的主键。

Required 用户指定非空列,如上面的“BirthDay”创建列之后为“not null”列。

MinLength 、 MaxLength 指定字段长度(此属性通常可以用户客户端验证),例如上面“Title”定义成了“nvarchar(30)”。

ComplexType 用于标记复杂类型,对于包含复杂类型数据属性的类在生成数据表时复杂类型中每个属性都将作为其中一列。

DatabaseGenerated 用于指定数据库字段生成列,此类EF将不会直接更新。可以指定为计算列、标识列和非数据库生成列(例如给主键列指定此属性为“None”则不会生成标识列)。需要注意的是如果使用Code First字段生成数据库,那么此属性仅仅可以用于byte、timestamp列上,否则请应用在已经存在数据库的情况下,因为Code First无法判定生成具体计算列的公式(至少目前Code First还不支持公式配置)。

Identity:自增长    None:不处理    Computed:表示这一列是计算列。

NotMapped 用户指定非映射列,标记此属性的列将不会在数据库中生成相应的列,例如上面的“PhotoPath ”没有在数据库中生成具体列,实际使用中它可能是通过其他具体规则得到的。

ConcurrencyCheck 用于进行并发检查,当一个用户A获得实体后通常会与数据库断开,此时如果另一个用户B也获得了实体并进行了修改,那么当A再进行更新时如果进行了“ConcurrencyCheck”标记则会进行并发检查,并根据原始值判断该实体是否存在,如果不存在则抛出异常。

TimeStamp 用于指定时间戳列,一个实体只能有一个TimeStamp列。在EF中TimeStamp是另一种并发控制方式,当EF遇到TimeStamp列会自动配置 “ConcurrencyCheck”及“DatabaseGenerated.Computed”来控制并发(通常我们推荐使用此方法)。

timestamp的精度更高,date精确到秒,而timestamp则精确到秒后三位。

ForeignKey 用于指定外键列,我们知道按照上面提到的默认约定第三条,当我们在“Order”中定义了“Customer”属性后,如果定义“CustomerID” 属性(当然还有其他形式,大家可以按照声明说的默认约定3进行测试),那么EF会在“Order”表中创建一个“CustomerID”列并建立与“Customer”表的外键关系。但是如果像上面定义“CustomerNo”属性并且不指定“ForeignKey”标记的话将达不到我们的预期,EF将默认创建一个“Customer_CustomerID”列并创建与“Customer”的外键约束,同时创建一个“CustomerNo”列。当然解决的方式大家已经看到了那就是给导航属性“Customer”指定“ForegnKey”标记并且指定外键列为“CustomerNo”(注意虽然在“Customer”中不定义“Order的导航属性”生成的表中也并没用任何问题,但是我们推荐您定义相应的导航属性)。

InverseProperty 用于定义多重外键关系约束。我们在EF中通过导航属性定义主外键关系,但是当主表中有两个外键约束时可能仅仅通过添加相应的导航属性就无法完成了,例如上面“Order”中“DeliverPerson”和“CheckPerson”均为“Employee”类型,按我们的预期当然是在生成“Order”表时生成两个外键列并创建与“Employee”外键约束关系,但是如果没有在“Employee”类的“DeliverOrder”和“CheckOrder”属性上标记 “InverseProperty”属性EF是无法识别这种关系的(具体结果可以看下图),当然解决方式就是在对应导航属性中标记“InverseProperty”并指定对于的列名。

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

导航属性(Navigationproperty)提供了一种在两个实体类型之间导航关系的方法。针对对象参与到其中的每个关系,各对象均可以具有导航属性。使用导航属性,可以 在两个方向上导航和管理关系,返回引用对象(如果多重性为一或者零或一)或集合(如果多重性为多)

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

数据库创建是由策略来控制的,有如下四种策略:

1.    CreateDatabaseIfNotExists:这是默认的策略。如果数据库不存在,那么就创建数据库。但是如果数据库存在了,而且实体发生了变化,就会出现常。

2.    DropCreateDatabaseIfModelChanges:此策略表明,如果模型变化了,数据库就会被重新创建,原来的数据库被删除掉了。

3.    DropCreateDatabaseAlways:此策略表示,每次运行程序都会重新创建数据库,这在开发和调试的时候非常有用。

4.    自定制数据库策略:可以自己实现IDatabaseInitializer来创建自己的策略。或者从已有的实现了IDatabaseInitializer接口的类派生。 如下示例显示了如何应用数据库创建策略:

public class UserManContext : DbContext {

public UserManContext()  : base("USMDBConnectionString")     {

Database.SetInitializer(new CreateDatabaseIfNotExists());

}

}

[MetadataType(typeof(Blog))] //将元数据类与实体分部类关联

[DisplayName(“博客”)] //描述

[Table("Blogs",Schema="dbo")] //定义表名

public class Blog {

  [Key] //主键

  public int PrimaryTrackingKey { get; set; }

  [Required] //不为空

  [DefaultValue("默认值")]//另外一种方式类的构造函数中进行赋值Title="默认值";

  public string Title { get; set; }

  [ConcurrencyCheck,MaxLength(10), MinLength(5)] //长度约束

  public string BloggerName { get;set; }

  [NotMapped]   //注释来标记不映射到数据库的所有属性

  public string BlogCode{

  get{

  returnTitle.Substring(0, 1) + ":" +BloggerName.Substring(0, 1);

  }

  }

  [Timestamp]

  publicByte[] TimeStamp { get;set; }

  public virtual ICollection Posts { get;set; }  // ICollection可用IList/List/Collection

}

public class Post {

  public int Id { get; set; }

  public string Title { get; set; }

  public DateTime DateCreated { get;set; }

  public string Content { get;set; }

  [Range(1,100,ErrorMessage=”{0}在{1}与{2}之间”)] //带参数的错误信息

  public int SkipNum{get;set;}

  public int BlogId { get; set; }

  [ForeignKey("BlogId")]

  Public virtual ICollectionComments { get; set;}

}

[ComplexType] //复杂类型公用内容集合可做为某一个类的一部分

public class BlogDetails{

  [DatabaseGenerated(DatabaseGeneratedOption.Computed)]

  public DateTime? DateCreated { get;set; }

  [MaxLength(250)]

  [Column("BlogDescription",TypeName = "ntext")]

  public string Description { get;set; }

}

publicclass Person {

  public int Id { get; set; }

  public string Name { get; set; }

  [InverseProperty("CreatedBy")]

  public ListPostsWritten { get; set;}

  [InverseProperty("UpdatedBy")]

  Public  ListPostsUpdated { get; set;}

}

[InverseProperty]

public class Student

{

public int StudentId { get; set; }

public string StudentName { get; set; }

public int ForeignKeyCurrent { get; set; }

public int ForeignKeyPrevious { get; set; }

[ForeignKey("ForeignKeyCurrent")]

public Standard CurrentStandard { get; set; }

[ForeignKey("ForeignKeyPrevious")]

public Standard PriviousStandard { get; set; }

}

public class Standard

{

public int StandardId { get; set; }

public string StandardName { get; set; }

/// InverseProperty,反属性特性

[InverseProperty("CurrentStandard")]

public ICollection CurrentStudent { get; set; }

/// InverseProperty

/// InverseProperty,反属性特性

[InverseProperty("PriviousStandard")]

public virtual ICollection PreviousStudent { get; set; } //virtual延迟加载

}

DbContext 使用DbSet 属性  Code First 示例中显示的常见情况是让 DbContext 为模型实体类型使用公共自动DbSet 属性。

例如:可使用 IDbSet 接口替代 DbSet

publicclass BloggingContext: DbContext {

  public DbSetBlogs { get; set;}

  public DbSetPosts { get; set;}

}

DbContext使用只读set属性

public DbSetBlogs{
  get{
    return Set();
  }
}

同步FK 和导航属性之间的更改

DbSet.Add

context.Blogs.Add(blog);

DbSet.Find

var post =context.Posts.Find(主键);

DbSet.Remove

DbSet.Local

DbContext.SaveChanges

DbSet.Attach

context.Blogs.Attach(existingBlog);

DbContext.GetValidationErrors

DbContext.Entry

context.Entry(blog).State =EntityState.Added;

context.Entry(existingBlog).State =EntityState.Unchanged;

context.Entry(existingBlog).State =EntityState.Modified;

DbChangeTracker.Entries

转自:https://www.cnblogs.com/xszjk/articles/5517507.html

【转】Code First 属性详解的更多相关文章

  1. OutputCache属性详解(一)一Duration、VaryByParam

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  2. odoo项目结构参数属性详解

    1.基础文件及目录结构 在认识odoo ORM框架前,先介绍一下odoo中模块目录结构.   data:存放模块预制数据i18n:存放国际化文件models:存放模型等py代码security:存放权 ...

  3. android:exported 属性详解

    属性详解 标签: android 2015-06-11 17:47 27940人阅读 评论(7) 收藏 举报 分类: Android(95) 项目点滴(25) 昨天在用360扫描应用漏洞时,扫描结果, ...

  4. OutputCache属性详解(二)一 Location

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  5. OutputCache属性详解(三)— VaryByHeader,VaryByCustom

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  6. OutputCache属性详解(四)— SqlDependency

    目录 OutputCache概念学习 OutputCache属性详解(一) OutputCache属性详解(二) OutputCache属性详解(三) OutputCache属性详解(四)— SqlD ...

  7. WPF依赖属性详解

    WPF依赖属性详解 WPF 依赖属性 英文译为 Dependency Properties,是WPF引入的一种新类型的属性,在WPF中有着极为广泛的应用,在WPF中对于WPF Dependency P ...

  8. HTML video 视频标签全属性详解

    HTML 5 video 视频标签全属性详解   现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(Opera.Mozilla.C ...

  9. Android组件---四大布局的属性详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4372222.html Android常见布局有下面几种: LinearL ...

随机推荐

  1. python学习 day06打卡

    今天学习的主要内容是: 一,小数据池 代码块的概念 python程序是由代码块构成的,一个代码块的文本作为python程序执行的单元. 代码块:一个模块,一个函数,一个类,甚至每一个command命令 ...

  2. MySQL中查询时间最大的一条记录

    在项目中要查询用户最近登录的一条记录的 ip 直接写如下 SQL: SELECT ip,MAX(act_time) FROM users_login GROUP BY login_id; 但是这样是取 ...

  3. js实现可视化区域内拖拽

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  4. codeforces gym 100947 J. Killing everything dp+二分

    J. Killing everything time limit per test 4 seconds memory limit per test 64 megabytes input standar ...

  5. 解决VS2017引用报错问题

    1.打开VS2017下的Developer Command Prompt for VS 2017 2.然后在CMD窗口输入 CD CD C:\Program Files\Microsoft Visua ...

  6. javaSE习题 第一章 JAVA语言概述

    转眼就开学了,正式在学校学习SE部分,由于暑假放视频过了一遍,略感觉轻松,今天开始,博客将会记录我的课本习题,主要以文字和代码的形式展现,一是把SE基础加强一下,二是课本中有很多知识是视频中没有的,做 ...

  7. django人类可读性

    一些Django的‘奇技淫巧’就存在于这些不起眼的地方. 为了提高模板系统对人类的友好性,Django在django.contrib.humanize中提供了一系列的模板过滤器,有助于为数据展示添加“ ...

  8. NativeWindow_02_DialogBoxParam_VC6

    PS: 代码参考于<<Windows环境下32位汇编语言程序设计.chm>>,第5章,"5.4 对 话 框(2)" . ZC: 与CreateWindow( ...

  9. 删除GitHub或者GitLab 上的文件夹,git rm -r --ceched 文件夹名 ,提交commit,git push

    方法一 这里以删除 .setting 文件夹为案例 git rm -r --cached .setting #--cached不会把本地的.setting删除 git commit -m 'delet ...

  10. SQL关于WHERE 的计算次序

    WHERE可包含任意数目的AND和OR操作符.允许两者结合以进行复杂 和高级的过滤. 但是OR和AND操作符是有先后次序的. 比如,原意是想找出 3班和5班年龄为21岁的同学,使用 :SELECT * ...