1. 程式人生 > >EF CodeFirst 約束配置

EF CodeFirst 約束配置

lena 就會 ctime png ner 實體映射 gui 基礎 move

一、通過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 約束配置