数据验证相关的数据注解:
特性 解释
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();
}
}
}