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 class ClassInfo {}
8、列值GUID化
當主鍵值需要自GUID化,則需要在對主鍵字段設置主鍵約束的基礎上追加DatabaseGenerated特性,代碼如下:
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)] public GUID Id{ get; set; }
如果沒有設置列值GUID化,數據庫中會以0來填充
第二行就會報錯,因為設置了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 class ClassInfo {}
13、復雜類型約束
請參考
12、示例
[Table("Class")] public class ClassInfo { [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; } }
以上是按照指定約束所生成的表
二、通過重寫DbContext的OnModelCreating方法,並設置對應表或者字段的約束
public class ClassInfo { 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 class EFCodeFirstDbContext:DbContext { public EFCodeFirstDbContext() : base("name=connStr") { } /// <summary> /// 實體映射到數據庫中,EF會將表名創建為實體名的復數形式,這裏就是強制使表名創建為實體名 /// </summary> /// <param name="modelBuilder"></param> protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Entity<ClassInfo>().ToTable("Class");//設置ClassInfo對應的表名為Class modelBuilder.Entity<ClassInfo>().Property(p=>p.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);//設置ClassInfo的Id為自增長 modelBuilder.Entity<ClassInfo>().HasKey(p=>p.Id);//設置ClassInfo的Id屬性為主鍵 modelBuilder.Entity<ClassInfo>().Property(p=>p.Name).IsRequired();//設置ClassInfo的Name屬性為非空 modelBuilder.Entity<ClassInfo>().Property(p=>p.Name).HasMaxLength(32);//設置ClassInfo的Name屬性值最大長度為32 modelBuilder.Entity<ClassInfo>().Property(p=>p.CreateTime).IsRequired();//設置ClassInfo的CreateTime屬性為非空 modelBuilder.Entity<ClassInfo>().Property(p => p.CreateTime).HasColumnName("CTime");//設置ClassInfo的CreateTime屬性名為CTime modelBuilder.Entity<ClassInfo>().Property(p => p.Remark).HasColumnType("ntext");//設置ClassInfo的Remark屬性類型為ntext modelBuilder.Entity<ClassInfo>().Property(p => p.Remark).HasMaxLength(20);//設置ClassInfo的Remark屬性值最大長度為32 modelBuilder.Entity<ClassInfo>().Ignore(p => p.NotNeed);//忽略NotNeed字段 } public DbSet<ClassInfo> ClassInfo { get; set; } }
EF CodeFirst 約束配置