创建、添加、修改和删除对象(实体框架)

对象上下文中的对象是实体类型的实例,表示数据源中的数据。 可以在对象上下文中修改、创建和删除对象,并且实体框架 可以跟踪对这些对象进行的更改。 调用 SaveChanges 方法时,实体框架 生成并执行针对数据源执行等效插入、更新或删除语句的命令。 有关更多信息,请参见保存更改和管理并发(实体框架)

将插入、更新和删除函数映射到存储过程

实体框架 允许您将实体类型的插入、更新和删除操作映射到存储过程。 如果计划将存储过程映射到实体,建议这三个操作都映射。 例如,如果将某个实体类型映射到插入和更新存储过程,但不映射到删除存储过程,然后尝试删除该类型的对象,则在运行时,删除操作将以 UpdateException 失败。 有关更多信息,请参见How to: Map Modification Functions to Stored ProceduresWalkthrough: Mapping an Entity to Stored Procedures

创建和添加对象

要在数据源中插入数据时,必须创建实体类型的实例,并将该对象添加到对象上下文。 若要将新对象保存到数据源中,必须先设置不支持 null 值的所有属性。 使用实体框架 生成的类时,考虑使用实体类型的静态 Create对象名称 方法创建实体类型的新实例。 实体数据模型 工具生成实体类型时,会在每个类中包含此方法。 此创建方法用于创建对象的实例并设置此类的不能为 null 的所有属性。 此方法对于在 CSDL 文件中已应用 Nullable="false" 特性的每个属性都包含一个参数。 有关更多信息,请参见如何:使用静态 Create 方法创建对象(实体框架)

使用 POCO(“纯旧式”CLR 对象)实体时,应使用 CreateObject 方法而不是 new 运算符创建新对象。 CreateObject 方法将新的 POCO 实例包装在适当的代理对象中。 有关更多信息,请参见使用 POCO 实体(实体框架)

可以使用以下方法之一将新对象添加到对象上下文中:

在添加新对象时需要考虑下列注意事项:

  • 调用 SaveChanges 之前,实体框架 会为每个新对象生成一个临时的键值。 调用 SaveChanges 后,该键值会被插入新行时数据源所指定的标识值所取代。

  • 如果数据源未生成实体的键值,应指定一个唯一值。 如果两个对象具有相同的用户指定键值,则在调用 SaveChanges 时会发生 InvalidOperationException。 如果发生此问题,应指定唯一值并重试该操作。

删除对象

调用 ObjectSetDeleteObjectObjectContextDeleteObject 方法将标记要删除的指定对象。 只有在调用 SaveChanges 之后,才会从数据源中删除该行。 在实体框架 中删除对象的行为有所不同,具体取决于对象所属的关系类型。

在标识关系(其中主体实体的主键是依赖实体的主键的一部分)中,删除某个对象时还会删除相关对象。 如果与父对象没有既定关系,则依赖对象无法存在。 删除父对象也会删除所有子对象。 这与对关系的关联启用 <OnDelete Action="Cascade" /> 特性相同。

在表示为外键关联的非标识关系中,删除主体对象后,实体框架 将依赖对象的可以为 null 的外键属性设置为 null

有关更多信息,请参见 OnDelete 元素 (CSDL)定义和管理关系(实体框架)

修改对象

实体框架 跟踪对附加到 ObjectContext 的对象的更改。 实体数据模型 工具生成一对分部方法,名为 On属性ChangingOn属性Changed。 这些方法是在属性 setter 中调用的。 在分部类中扩展这些方法可以在属性更改过程中插入自定义业务逻辑。 有关更多信息,请参见如何:在标量属性更改过程中执行业务逻辑(实体框架)。 有关使用 POCO 实体的指南,请参见跟踪 POCO 实体中的更改(实体框架)

在修改对象时,应考虑以下注意事项:

  • 更改复杂对象的任何标量或复杂属性后,顶级实体对象的状态将更改为 Modified。 在不符合代理生成要求(如创建 POCO 代理的要求(实体框架)中所述)的 POCO 实体中,当调用 DetectChanges 方法时,已修改属性的状态将更改为 Modified

  • 当对象处于 Detached 状态时,不会跟踪更改。 当对象由使用 NoTracking 合并选项的查询返回,或通过调用 DetachObjectContext 分离后,对象处于此状态。

  • 当更改外键关联时,依赖对象的状态更改为 Modified。 当更改独立关联时,依赖对象的状态不会更改。

有关跟踪 POCO 实体中更改的信息,请参见跟踪 POCO 实体中的更改(实体框架)

向特定 EntitySet 添加对象

有时某一实体类型可能属于多个实体集。 例如,假设数据库有两个架构相同的表。 如果要对数据进行分区以实现更有效的备份过程,就可能出现这种情况。 例如,您的客户数据可能会分别放在 CustomerCustomerArchive 表中,其中 CustomerArchiveCustomer 具有相同的架构,但用于 6 个月以上没有下订单的客户。 Customer 可能每天晚上备份,但 CustomerArchive 每周才备份一次。 从映射的角度来看,CustomerCustomerArchive 必须属于不同的实体集。 实体框架 通过允许实体类型存在于一个或多个实体集来支持此方案。 有关更多信息,请参见EntitySet 元素 (CSDL)

当某个实体类型存在于多个实体集中时,实体框架 允许您向特定实体集添加该类型的新实例。 从 .NET Framework 版本 4 开始,为特定模型生成的 ObjectContext 类具有类型为 ObjectSet 的属性,这些属性表示该模型的实体集。 AddObject 方法用于将新对象添加到对象上下文中。 有关更多信息,请参见使用 ObjectSet(实体框架)。 在 .NET Framework 3.5 SP1 中,调用 AddObject 方法向对象上下文添加对象时必须指定 entitySetName 的值。

本节内容

如何:添加、修改和删除对象(实体框架)

如何:使用静态 Create 方法创建对象(实体框架)

另请参见

任务

如何:通过每种类型多个实体集定义模型(实体框架)
如何:添加、修改和删除对象(实体框架)

概念

定义和管理关系(实体框架)
使用 POCO 实体(实体框架)
使用 ObjectSet(实体框架)
使用 ObjectSet(实体框架)
OnDelete 元素 (CSDL)