Entity Framework(在数据库中创建表)
数据验证相关的数据注解:
特性 解释
Remote 使用 jQuery 验证插件远程验证程序的特性
FileExtension 验证文件扩展名
Compare 比较两个属性的值
RegularExpression 使用正则表达式验证
CustomValidation 自定义验证方法
DataType 指定要与数据字段关联的附加类型的名称
EmailAddress 电子邮件地址(相当于DataType(DataType.Email))
Phone 电话(相当于DataType(DataType.Phone))
CreditCard 信用卡号码(相当于DataType(DataType.CreditCard))
Url 验证URL(相当于DataType(DataType.Url))
MemberShipPassword 验证密码字段是否满足成员资格提供程序的当前密码要求
数据映射相关的数据注解:
特性 解释
Key 主键字段
Column 数据库列属性映射
NotMapped 不要创建对应的字段
Table 指定类将映射到的数据库表
ForeignKey 表示关系中用作外键的属性
DatabaseGenerated 指定属性应该映射到数据表中计算的列。也可以用于映射到自动增长的数据库表。
指定数据库生成属性值的方式(EF不追踪属性的变化)
Required 必填字段
MaxLength 指定属性中允许的数组或字符串数据的最大长度
MinLength 指定属性中允许的数组或字符串数据的最小长度
StringLength 指定最小和最大字符长度
Range 指定数值范围
数据显示相关的数据注解:
特性 解释
DisplayName 指定本地化的字符串(习惯用语类)
Display 指定本地化的字符串(习惯用语属性)
DisplayFormat 设置数据字段的格式
ReadOnly 指定该特性所绑定到的属性是只读属性还是读/写属性
EditAble 指示数据字段是否可编辑
HiddenInput 指示是否应将属性值或字段值呈现为隐藏的 input 元素
ScaffoldColumn 指定类或数据列是否使用基架
UIHint 指定动态数据用来显示数据字段的模板
其他:
特性 解释
DisplayColumn 将所引用的表中显示的列指定为外键列
Description 可视化设计器在引用组件成员时可以显示指定的说明
(命名空间:System.ComponentModel.DescriptionAttribute)
Category类
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CodeFirstAppDemo.Models { /// <summary> /// 产品分类表 /// </summary> public class Category { /// <summary> /// 分类ID /// </summary> public int CategoryId { get; set; } /// <summary> /// 分类名称 /// </summary> public string CategoryName { get; set; } /// <summary> /// 产品 /// </summary> public List<Product> ProductList { get; set; } } }
Product实体类
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EFDataAnnotations.Model { /// <summary> /// 使用Table特性指定生成的表名 /// </summary> [Table("Product")] public class Product { //使用Key特性指示该列是主键列 [Key] //使用Column特性指示生成的数据库表中的列名 [Column("ID")] public int ProductId { get; set; } /// <summary> /// StringLength设置数据库表中列的长度 /// 指示ProductName字段的最大长度是10,最小长度是2 /// </summary> [StringLength(10,MinimumLength=2)] public string ProductName { get; set; } public double Price { get; set; } /// <summary> /// DataType特性指示生成的数据库表中列的数据类型 /// </summary> [DataType(DataType.DateTime)] public DateTime ProductionTime { get; set; } } }
这里需要注意两点:
1、不需要给Product.Id属性赋值,因为它对应到SQL Server表中的主键列,它的值是自动生成的,当SaveChanges执行以后,打断点就能看到返回的Product.Id已经有值了。
2、Context的实例用了using语句包装起来,这是因为DbContext实现了IDisposable接口。DbContext还包含了DbConnection的实例,该实例指向了具有特定连接字符串的数据库。在EF中合适地释放数据库连接和ADO.NET中同等重要。
数据库上下文Context类定义如下:
using EFAppointmentCreateTable.Model; using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; using System.Text; namespace EFAppointmentCreateTable.EFContext { /// <summary> /// 定义数据库上下文类,该类继承自DbContext /// </summary> public class Context:DbContext { /// <summary> /// 定义构造函数,继承自父类的构造函数,通过继承父类的构造函数来创建数据库 /// 父类构造函数的参数是配置文件中配置的数据库连接字符串 /// </summary> public Context() : base("CodeFirstApp") { } //实体属性集合 根据实体名称的复数形式生成数据库的表名 // 生成的表名是Products 和属性名Products无关 // 即使把属性名改成Product,生成的表名还是Products 约定大于配置
public DbSet<Category> Categorys { get; set; }
public DbSet<Product> Products { get; set; } } }
在这里,DbContext是所有基于EF的上下文基类,通过它可以访问到数据库中的所有表。上面的代码中调用了父类的构造函数,并且传入了一个键值对,键是name,值是CodeFirstApp,这个键值对是定义在应用程序的配置文件中的,取决于你的应用程序类型,可能是app.config或者web.config。在我们的控制台应用程序中就是app.config。
在app.config文件的configuration节点下(不要在第一个节点下,否则会报错)添加:
<connectionStrings> <add name="CodeFirstApp" connectionString="Server=.;Database=CodeFirstApp;User Id=sa;Password=test" providerName="System.Data.SqlClient"/> </connectionStrings>
在SQL数据库中创建数据库DbConnection:
using CodeFirstAppDemo.EFDbContext; using CodeFirstAppDemo.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CodeFirstAppDemo { class Program { static void Main(string[] args) { // 使用数据库上下文Context using (var context = new Context()) { // 如果数据库不存在,则调用EF内置的API创建数据库 if (context.Database.CreateIfNotExists()) { Console.WriteLine("数据库创建成功!"); } else { Console.WriteLine("数据库已存在"); } #region EF 添加数据 //添加数据 var cate = new List<Category> { new Category{ CategoryName="文学类", ProductList=new List<Product>{ new Product { ProductName="百年孤独", Price=37.53m, PublicDate=new DateTime(2011,6,1) }, new Product { ProductName="老人与海", Price=37.53m, PublicDate=new DateTime(2010,6,1) } } }, new Category{ CategoryName="计算机类", ProductList=new List<Product>{ new Product { ProductName="C#高级编程第九版", Price=48.23m, PublicDate=new DateTime(2016,2,8) }, new Product { ProductName="Oracle从入门到精通", Price=27.03m, PublicDate=new DateTime(2014,7,9) } } } }; //将创建的集合添加到上下文中 context.Categorys.AddRange(cate); //调用SaveChanges()方法,将数据插入到数据库 context.SaveChanges(); #endregion } Console.ReadKey(); } } }