mysql字段约束first_EF CodeFirst 约束配置

一、通过Attribute配置约束

1、主键约束

通过KeyAttribute来配置主键约束,代码如下:

[Key]public int PrimaryKey{ get; set; }

2、外键约束

通过ForeignKeyAttribute来配置外键约束,代码如下:

[Key]public int PrimaryKey{ get; set; }

[ForeignKey("ForeignKey")]public int PrimaryKey{ get; set; }

注意,指定列名存在(外键必须存在),如上面的ForeignKey,则类中必须存在名称为ForeignKey的属性。

3、长度约束

(1)、普通长度约束,通过StringLengthAttribute来配置普通长度约束,代码如下:

[StringLength(30)]public string Name { get; set; }

(2)、最大长度约束,通过MaxLengthAttribute,代码如下:

[MaxLength(30)]public string Name { get; set; }

(3)、最小长度约束,通过MinLengthAttribute,代码如下:

[MinLength(30)]public string Name { get; set; }

4、非空约束

非空约束比较简单,通过RequiredAttribute,代码如下:

[Required]public string Name{ get; set; }

5、数据类型约束

通过初始化ColumnAttribute类的TypeName属性来配置数据类型约束,代码如下:

[Column(TypeName="byte")]public string Photo{get;set;}

6、字段名约束

通过初始化ColumnAttribute类的带string参数的构造函数设置,代码如下:

[Column("CTime")]public DateTime CreateTime { get; set; }

7、表名约束

通过TableAttribute类的带string参数的构造函数设置,代码如下:

[Table("Class")]public classClassInfo

{}

8、列值GUID化

当主键值需要自GUID化,则需要在对主键字段设置主键约束的基础上追加DatabaseGenerated特性,代码如下:

[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]public GUID Id{ get; set; }

如果没有设置列值GUID化,数据库中会以0来填充

61b7802d14979198a406b50e36cdf31f.png

第二行就会报错,因为设置了Id为主键

9、列值+DatabaseGeneratedOption.Computed

[Key,DatabaseGenerated(DatabaseGeneratedOption.Computed)]public GUID Id{ get; set; }

如果将属性标识为Computed,EF会认为该列是通过其它列计算得出的,不会将其持久化到数据库中。

10、列值+DatabaseGeneratedOption.None

[Key,DatabaseGenerated(DatabaseGeneratedOption.None)]public int Id{ get; set; }

这个就等同于Id主键自增效果

11、忽略列映射

当实体类中定义了某些字段,这些字段是通过一些计算或者合并得到的,我们并不需要将它同步到数据库中,就可以通过配置不让它生成到数据库中,EF中通过NotMappedAttribute特性来设置,代码如下:

[NotMapped]public string NotNeeded { get; set; }

12、忽略表映射

忽略表映射和忽略列映射一样. 代码如下:

[NotMapped]public classClassInfo

{}

13、复杂类型约束

12、示例

[Table("Class")]public classClassInfo

{

[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]public Guid Id { get; set; }

[Required,StringLength(32)]public string Name { get; set; }

[Required,Column("CTime")]public DateTime CreateTime { get; set; }

[Column(TypeName= "ntext"), MaxLength(20), MinLength(10)]public string Remark { get; set; }

[NotMapped]public string NotNeed { get; set; }

}

991cb66c943f6b78ee8ebd20e3cc4270.png

以上是按照指定约束所生成的表

二、通过重写DbContext的OnModelCreating方法,并设置对应表或者字段的约束

public classClassInfo

{public Guid Id { get; set; }public string Name { get; set; }public DateTime CreateTime { get; set; }public string Remark { get; set; }public string NotNeed { get; set; }

}

public classEFCodeFirstDbContext:DbContext

{publicEFCodeFirstDbContext()

:base("name=connStr")

{

}///

///实体映射到数据库中,EF会将表名创建为实体名的复数形式,这里就是强制使表名创建为实体名///

///

protected override voidOnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.Conventions.Remove();

modelBuilder.Entity().ToTable("Class");//设置ClassInfo对应的表名为Class

modelBuilder.Entity().Property(p=>p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);//设置ClassInfo的Id为自增长

modelBuilder.Entity().HasKey(p=>p.Id);//设置ClassInfo的Id属性为主键

modelBuilder.Entity().Property(p=>p.Name).IsRequired();//设置ClassInfo的Name属性为非空

modelBuilder.Entity().Property(p=>p.Name).HasMaxLength(32);//设置ClassInfo的Name属性值最大长度为32

modelBuilder.Entity().Property(p=>p.CreateTime).IsRequired();//设置ClassInfo的CreateTime属性为非空

modelBuilder.Entity().Property(p => p.CreateTime).HasColumnName("CTime");//设置ClassInfo的CreateTime属性名为CTime

modelBuilder.Entity().Property(p => p.Remark).HasColumnType("ntext");//设置ClassInfo的Remark属性类型为ntext

modelBuilder.Entity().Property(p => p.Remark).HasMaxLength(20);//设置ClassInfo的Remark属性值最大长度为32

modelBuilder.Entity().Ignore(p => p.NotNeed);//忽略NotNeed字段

}public DbSet ClassInfo { get; set; }

}

0fb699cdd7c91a2f08e9021a70729bf5.png

原文:http://www.cnblogs.com/GreenLeaves/p/7589350.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值