一、Code First
Code First方式只需要代码,不需要Edmx模型。EF通过实体类型结构推断生成SQL并创建数据库中的表。开发人员只需要编写实体类就可以进行EF数据库的开发。
Code First 有两种配置数据库映射的方式,一种是使用数据属性DataAnnotation,另外一种是使用Fluent API。
DataAnnotation的配置方式需要给实体类和类中的属性加上与数据库映射相关的配置标签。常见配置标签如下:
[Key]------主键,[Required]------非空,[MaxLenth],[MinLength],[StringLength]-----长度限制,[Table]-----表名,[Column]-----列名,[DatabaseGenerated]自增长,
[ForeignKey]----外键,[NotMapped]-----忽略映射
要使用Fluent API 就必须在自定义的继承自DbContext类中重载OnModelCreating方法。这个方法签名如下:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
通过modelBuilder这个对象的Entity<>泛型方法类配置DbContext中的每个类的数据库映射
例如通过Fluent API配置数据库表的名字:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Customer>().ToTable("CustomerInfo"); }
二、创建Code First Demo
1.右键EFDemo解决方案,“添加-》新建项目-》控制台应用程序”,修改项目名称为CodeFirst
2.右键CodeFirst项目引用,选择“管理NuGet程序包”,搜索entity freamwork,安装entity freamwork包,如下图:
3.创建模型
添加一个Models文件夹,在Models下新建Order和OrderDetial模型
public class Order { /// <summary> /// Id 或者 类名+Id 的属性,默认会当成主键 ,不用添加[Key]特性 /// </summary> [Key] public long OrderId { get; set; } /// <summary> /// 订单号 /// </summary> [StringLength(50)] public string OrderCode { get; set; } /// <summary> /// 订单金额 /// </summary> public decimal OrderAmount { get; set; } /// <summary> /// 导航属性设置成virtual,可以实现延迟加载 /// </summary> public virtual List<OrderDetail> OrderDetail { get; set; } }
public class OrderDetail { [Key] public long OrderDetailId { get; set; } /// <summary> /// 订单明细单价 /// </summary> public decimal Price { get; set; } /// <summary> /// 订单明细数量 /// </summary> public int Count { get; set; } /// <summary> /// 外键,如果属性名称和Order主键名称一样,默认会当成外键,可以不加[ForeignKey]特性 /// 注意,ForeignKey里面的值要和导航属性的名称一致 /// </summary> [ForeignKey("Order")] public long OrderId { get; set; } /// <summary> /// 导航属性 /// </summary> public virtual Order Order { get; set; } }
4.在配置文件中配置连接字符串
在App.config中添加如下配置节点,注意provideName必须填写,否则报错
<connectionStrings> <add name="CodeFirstContext" connectionString="Data Source=SC-201703312219;Initial Catalog=EFDemoDB;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings>
5.创建上下文类CodeFirstContext
public class CodeFirstContext : DbContext { public CodeFirstContext() : base("name=CodeFirstContext") { } public virtual DbSet<Order> Orders { get; set; } public virtual DbSet<OrderDetail> OrderDetails { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //Database.SetInitializer<CodeFirstContext>(null);//不检查 // Database.SetInitializer<CodeFirstContext>(new DropCreateDatabaseIfModelChanges<CodeFirstContext>());//模型修改了 删除数据库 Database.SetInitializer<CodeFirstContext>(new DropCreateDatabaseAlways<CodeFirstContext>());//每次启动都删除数据库 }
6.调用插入数据
static void Main(string[] args) { try { using (CodeFirstContext context = new CodeFirstContext()) { Order order = new Order() { OrderCode="sdfdsgdfgrertef", OrderAmount=74.23M, }; context.Orders.Add(order); context.SaveChanges(); } Console.WriteLine("完成!"); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); }