下面解释每个配置的作用

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. 新加坡金融科技节 | 蚂蚁金服CTO程立:面向全球开放,与合作伙伴共赢

    小蚂蚁说: 11月13日,在新加坡金融科技节上,蚂蚁金服CTO程立分别从TechFin.BASIC战略.SOFAStack全栈分布式体系以及全面开放等方面讲述蚂蚁金融科技. TechFin是一种“倒立 ...

  2. [Python]IO密集型任务 VS 计算密集型任务

    所谓IO密集型任务,是指磁盘IO.网络IO占主要的任务,计算量很小.比如请求网页.读写文件等.当然我们在Python中可以利用sleep达到IO密集型任务的目的. 所谓计算密集型任务,是指CPU计算占 ...

  3. pom中配置的仓库无效的问题

    今天在用spring cloud的时候发现,配置的pom仓库一直无效(官网要求2.0版本直接从指定仓库里下).于是上网搜索,发现(http://18810098265.iteye.com/blog/2 ...

  4. memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

    1.在http://libevent.org/   下载libevent-2.0.22-stable.tar.gz 2.tar -zxvf libevent-2.0.22-stable.tar.gz ...

  5. 设计模式之组合模式(composite)

    概念: 将对象组合成树形结构以表示“部分-整体”的层次结构.使用户对单个对象和组合对象的使用更具有一致性. 适用性:想表示对象的部分-整体层次结构.

  6. 前端阶段_html部分

    HTML 1.html5的第一行一定是<!DOCTYPE html>,h4太长,而且一般ide中会自动加载,了解即可. 2.h5的整个页面被<html></html> ...

  7. linux JAVA_HOME和 java -version不匹配

    ~/.bashrc 中更新了jdk, JAVA_HOME 起效果了,但是java -version还是老的. 原因是/usr/bin/java   和usr/bin/javac是一个链接,得改. 使用 ...

  8. Python 闭包(Closure)

    Python  闭包 (Closure) 这里介绍一下python 的闭包 基本概念 闭包(closure)是函数式编程的重要的语法结构. 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函 ...

  9. 获取解码字符串指定位置的数值 Decoded String at Index

    2018-10-04 12:53:06 问题描述: 问题求解: 首先本题给出了问题的规模,从Note中我们可以看到解码后的字符串长度甚至可以达到2^63的长度,这个长度已经远远超过整型数的范围,因此如 ...

  10. (转)C# System.Diagnostics.Process.Start使用

    经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 如何做呢?  方法:使用 ...