ObjectContext.DeleteObject(Object) 方法
定义
标记对象以备删除。Marks an object for deletion.
public:
void DeleteObject(System::Object ^ entity);
public void DeleteObject (object entity);
member this.DeleteObject : obj -> unit
Public Sub DeleteObject (entity As Object)
参数
- entity
- Object
指定待删除实体的对象。An object that specifies the entity to delete. 该对象可以为任何状态(Detached 除外)。The object can be in any state except Detached.
例外
entity 为 null。entity is null.
entity 不存在。entity does not exist.
示例
这些示例基于 Microsoft SQL Server 产品示例:数据库。These examples are based on the Microsoft SQL Server Product Samples: Database.
此示例使用 EntityKey 特定 ProductID 构造,使用该密钥从数据源中检索产品对象,删除产品并保存对数据库所做的更改。This example constructs an EntityKey with a specific ProductID, uses the key to retrieve a Product object from the data source, deletes the product, and saves the changes to the database.
object deletedProduct;
// Define the key of the product to delete.
EntityKey productKey =
new EntityKey("AdventureWorksEntities.Products",
"ProductID", productId);
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
// Get the object to delete with the specified key.
if (context.TryGetObjectByKey(productKey, out deletedProduct))
{
try
{
// Delete the object with the specified key
// and save changes to delete the row from the data source.
context.DeleteObject(deletedProduct);
context.SaveChanges();
}
catch (OptimisticConcurrencyException ex)
{
throw new InvalidOperationException(string.Format(
"The product with an ID of '{0}' could not be deleted.\n"
+ "Make sure that any related objects are already deleted.\n",
productKey.EntityKeyValues[0].Value), ex);
}
}
else
{
throw new InvalidOperationException(string.Format(
"The product with an ID of '{0}' could not be found.\n"
+ "Make sure that Product exists.\n",
productKey.EntityKeyValues[0].Value));
}
}
Dim deletedProduct As Object
' Define the key of the product to delete.
Dim productKey As New EntityKey("AdventureWorksEntities.Products", "ProductID", productId)
Using context As New AdventureWorksEntities()
' Get the object to delete with the specified key.
If context.TryGetObjectByKey(productKey, deletedProduct) Then
Try
' Delete the object with the specified key
' and save changes to delete the row from the data source.
context.DeleteObject(deletedProduct)
context.SaveChanges()
Catch ex As OptimisticConcurrencyException
Throw New InvalidOperationException(String.Format("The product with an ID of '{0}' could not be deleted." & _
"Make sure that any related objects are already deleted.", _
productKey.EntityKeyValues(0).Value), ex)
End Try
Else
Throw New InvalidOperationException(String.Format("The product with an ID of '{0}' could not be found." & _
"Make sure that Product exists.", productKey.EntityKeyValues(0).Value))
End If
End Using
此示例删除现有订单项,添加新项,并保存对数据库所做的更改。This example deletes an existing order item, adds a new item, and saves the changes to the database.
// Specify the order to update.
int orderId = 43680;
using (AdventureWorksEntities context =
new AdventureWorksEntities())
{
try
{
var order = (from o in context.SalesOrderHeaders
where o.SalesOrderID == orderId
select o).First();
// Change the status and ship date of an existing order.
order.Status = 1;
order.ShipDate = DateTime.Today;
// You do not have to call the Load method to load the details for the order,
// because lazy loading is set to true
// by the constructor of the AdventureWorksEntities object.
// With lazy loading set to true the related objects are loaded when
// you access the navigation property. In this case SalesOrderDetails.
// Delete the first item in the order.
context.DeleteObject(order.SalesOrderDetails.First());
// Create a new SalesOrderDetail object.
// You can use the static CreateObjectName method (the Entity Framework
// adds this method to the generated entity types) instead of the new operator:
// SalesOrderDetail.CreateSalesOrderDetail(1, 0, 2, 750, 1, (decimal)2171.2942, 0, 0,
// Guid.NewGuid(), DateTime.Today));
SalesOrderDetail detail = new SalesOrderDetail
{
SalesOrderID = 1,
SalesOrderDetailID = 0,
OrderQty = 2,
ProductID = 750,
SpecialOfferID = 1,
UnitPrice = (decimal)2171.2942,
UnitPriceDiscount = 0,
LineTotal = 0,
rowguid = Guid.NewGuid(),
ModifiedDate = DateTime.Now
};
order.SalesOrderDetails.Add(detail);
// Save changes in the object context to the database.
int changes = context.SaveChanges();
Console.WriteLine(changes.ToString() + " changes saved!");
Console.WriteLine("Updated item for order: "
+ order.SalesOrderID.ToString());
foreach (SalesOrderDetail item in order.SalesOrderDetails)
{
Console.WriteLine("Item ID: "
+ item.SalesOrderDetailID.ToString() + " Product: "
+ item.ProductID.ToString() + " Quantity: "
+ item.OrderQty.ToString());
}
}
catch (UpdateException ex)
{
Console.WriteLine(ex.ToString());
}
}
' Specify the order to update.
Dim orderId As Integer = 43680
Using context As New AdventureWorksEntities()
Try
Dim order = (From o In context.SalesOrderHeaders
Where o.SalesOrderID = orderId
Select o).First()
' Change the status and ship date of an existing order.
order.Status = 1
order.ShipDate = DateTime.Today
' You do not have to call the Load method to load the details for the order,
' because lazy loading is set to true
' by the constructor of the AdventureWorksEntities object.
' With lazy loading set to true the related objects are loaded when
' you access the navigation property. In this case SalesOrderDetails.
' Delete the first item in the order.
context.DeleteObject(order.SalesOrderDetails.First())
' Create a new SalesOrderDetail object.
' You can use the static CreateObjectName method (the Entity Framework
' adds this method to the generated entity types) instead of the new operator:
' SalesOrderDetail.CreateSalesOrderDetail(1, 0, 2, 750, 1, (decimal)2171.2942, 0, 0,
' Guid.NewGuid(), DateTime.Today))
Dim detail = New SalesOrderDetail With
{
.SalesOrderID = 0,
.SalesOrderDetailID = 0,
.OrderQty = 2,
.ProductID = 750,
.SpecialOfferID = 1,
.UnitPrice = CDec(2171.2942),
.UnitPriceDiscount = 0,
.LineTotal = 0,
.rowguid = Guid.NewGuid(),
.ModifiedDate = DateTime.Now
}
order.SalesOrderDetails.Add(detail)
' Save changes in the object context to the database.
Dim changes As Integer = context.SaveChanges()
Console.WriteLine(changes.ToString() + " changes saved!")
Console.WriteLine("Updated item for order: {0}", order.SalesOrderID.ToString())
For Each item As SalesOrderDetail In order.SalesOrderDetails
Console.WriteLine("Item ID: {0}", item.SalesOrderDetailID.ToString())
Console.WriteLine("Product: {0}", item.ProductID.ToString())
Console.WriteLine("Quantity: {0}", item.OrderQty.ToString())
Next
Catch ex As UpdateException
Console.WriteLine(ex.ToString())
End Try
End Using
注解
从 ObjectStateManager 中标记对象以备删除。Marks an object for deletion from the ObjectStateManager. 当调用 SaveChanges 方法时,在数据源中删除该对象。The object is deleted in the data source when the SaveChanges method is called.
删除父对象也会删除约束关系中的所有子对象。Deleting the parent object also deletes all the child objects in the constrained relationship. 此结果与启用关系的关联上的 CascadeDelete 属性相同。This result is the same as enabling the CascadeDelete property on the association for the relationship.
DeleteObject可以在已删除的对象上调用方法。The DeleteObject method can be called on objects that are already deleted.