实体框架是一个对象/关系映射框架。它将代码中的域对象映射到关系数据库中的实体。在大多数情况下,您不必担心数据库层,因为Entity Framework会为您处理它。您的代码操纵对象,并且更改将持久保存到数据库。
创建域模型
添加模型
有三种方法可以实现实体框架:
数据库优先:从数据库开始,实体框架生成代码。
模型优先:从可视化模型开始,实体框架生成数据库和代码。
代码优先:从代码开始,实体框架生成数据库。
我们使用的是代码优先方法,因此我们首先将域对象定义为POCO(普通旧CLR对象)。使用代码优先方法,域对象不需要任何额外的代码来支持数据库层,例如事务或持久性。(具体来说,它们不需要从EntityObject类继承。)您仍然可以使用数据注释来控制Entity Framework如何创建数据库模式。
由于POCO不包含任何描述数据库状态的额外属性,因此可以轻松地将它们序列化为JSON或XML。但是,这并不意味着您应该始终将您的Entity Framework模型直接暴露给客户端
创建以下POCO:产品、订购、订单详情
要创建每个类,请在解决方案资源管理器中右键单击Models文件夹。从上下文菜单中,选择“ 添加”,然后选择“ 类”。
添加Product具有以下实现的类:
namespace ProductStore.Models
{
using System.ComponentModel.DataAnnotations;
public class Product
{
[ScaffoldColumn(false)]
public int Id { get; set; }
[Required]
public string Name { get; set; }
public decimal Price { get; set; }
public decimal ActualCost { get; set; }
}
}
按照惯例,Entity Framework使用该Id属性作为主键,并将其映射到数据库表中的标识列。创建新Product实例时,不会为其设置值Id,因为数据库会生成值。
该ScaffoldColumn属性告诉ASP.NET MVC跳过Id生成编辑表单时财产。将所需的属性是用来验证模型。它指定该Name属性必须是非空字符串。
添加Order课程:
namespace ProductStore.Models
{
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
public class Order
{
public int Id { get; set; }
[Required]
public string Customer { get; set; }
// Navigation property
public ICollection<OrderDetail> OrderDetails { get; set; }
}
}
添加OrderDetail课程:
namespace ProductStore.Models
{
public class OrderDetail
{
public int Id { get; set; }
public int Quantity { get; set; }
public int OrderId { get; set; }
public int ProductId { get; set; }
// Navigation properties
public Product Product { get; set; }
public Order Order { get; set; }
}
}
外键关系
订单包含许多订单详细信息,每个订单详细信息指的是单个产品。为了表示这些关系,OrderDetail该类定义了名为OrderId和的属性ProductId。实体框架将推断这些属性表示外键,并将向数据库添加外键约束。
见图image2.png
该Order和OrderDetail教学内容还包括“导航”的属性,它包含对相关对象的引用。根据订单,您可以按照导航属性导航到订单中的产品。
立即编译项目。实体框架使用反射来发现模型的属性,因此它需要编译的程序集来创建数据库模式。