1、DbContext(上下文类)
DbContext是实体类与数据库的桥梁,主要负责与数据交互。
DbContext主要负责以下活动:
EntitySet::DbContext包含了所有映射到表的entities
Querying:将Linq-To-Entities转译为Sql并发送到数据库
Change Tracking:从数据库获取entities后保留并跟踪实体数据变化
Persisting Data:根据entity状态执行Insert、update、delete命令
Caching:DbContext的默认第一级缓存,在上下文中的生命周期中存储entity
Manage Relationship:DbContext在DbFirst模式中使用CSDL、MSL、SSDL管理对象关系,Code first中使用fluent api 管理关系
Object Materialization:DbContext将物理表转成entity实例对象
Entity Framework Code First属性映射约定
Entity Framework Code First与数据表之间的映射方式有两种实现:Data Annotation和Fluent API。本文中采用创建Product类为例来说明tity Framework Code First属性映射约定的具体方式。
1.1 Data Annotation方式
在使用Data Annotation方式进行Entity Framework Code First与数据库映射之前,需要先添加命名空间引用。
using System.ComponentModel.DataAnnotations.Schema;
为类配置对应表名:
[Table("Product")]
public class Product
为类配置对应表名并指定表的所有者:
[Table("Product", Schema = "dbo")]
public class Product
1.2 Fluent API方式
Fluent API实现配置Entity Framework Code First与数据库映射关系主要是通过继承DbContext并重写其中的OnModelCreating方法来进行的。在本文中新建类文件PortalContext.cs继承DbContext。
在继承DbContext之前,添加命名空间引用。
using System.Data.Entity;
重写OnModelCreating方法,配置类对应于数据库中的表名:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("Product");
}
重写OnModelCreating方法,配置类对应于数据库中的表名,并指定表的所有者:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("Product", "dbo");
}
到此处PortalContext.cs的完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity;
using Portal.Entities;
namespace Portal
{
public class PortalContext : DbContext
{
static PortalContext()
{
Database.SetInitializer(new DropCreateDatabaseIfModelChanges());
}
public PortalContext()
: base("name=PortalContext")
{
}
public DbSet Products { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().ToTable("Product", "dbo");
}
}
}
2.1 Data Annotation方式
[Column("ProductID")]
public int ProductID { get; set; }
[MaxLength(100)]
[Required, Column("ProductName")]
public string ProductName { get; set; }
在使用Required特性(Attribute)设置字段不允许为空时,需要添加命名空间引用:
using System.Com