C# EF常用约束写法

做个笔记:
文章转自博客园,原文地址:EF常用约束写法
侵删!

一、通过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、复杂类型约束

请参考

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

[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; }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,LINQ(Language Integrated Query)是一种强大的查询语言和操作数据的方式。它提供了一组简洁、一致和可组合的操作符,用于查询和操作各种数据源,如集合、数据库、XML等。以下是一些常见的LINQ写法示例: 1. 查询集合中的元素: ```csharp var numbers = new List<int> { 1, 2, 3, 4, 5 }; var evenNumbers = numbers.Where(n => n % 2 == 0); foreach (var number in evenNumbers) { Console.WriteLine(number); } ``` 2. 对集合进行排序: ```csharp var numbers = new List<int> { 3, 1, 4, 2, 5 }; var sortedNumbers = numbers.OrderBy(n => n); foreach (var number in sortedNumbers) { Console.WriteLine(number); } ``` 3. 使用投影选择集合中的某些属性: ```csharp var persons = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 30 }, new Person { Name = "Charlie", Age = 35 } }; var names = persons.Select(p => p.Name); foreach (var name in names) { Console.WriteLine(name); } ``` 4. 使用聚合函数计算集合的统计值: ```csharp var numbers = new List<int> { 1, 2, 3, 4, 5 }; var sum = numbers.Sum(); var average = numbers.Average(); var max = numbers.Max(); var min = numbers.Min(); Console.WriteLine("Sum: " + sum); Console.WriteLine("Average: " + average); Console.WriteLine("Max: " + max); Console.WriteLine("Min: " + min); ``` 这只是LINQ的一小部分功能示例,还有更多的操作符和用法可以探索和应用。请记住,要使用LINQ,你需要引入`System.Linq`命名空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值