LINQ to SQL语句(12)之Delete和使用Attach

7 篇文章 0 订阅

删除(Delete)

1.简单形式

说明:调用DeleteOnSubmit方法即可。

OrderDetail orderDetail =

db.OrderDetails.First

(c => c.OrderID == 10255 && c.ProductID == 36);

db.OrderDetails.DeleteOnSubmit(orderDetail);

db.SubmitChanges();

语句描述:使用 DeleteOnSubmit方法从OrderDetail 表中删除OrderDetail对象。调用 SubmitChanges 将此删除保持到数据库。

2.一对多关系

说明:Order 与OrderDetail是一对多关系,首先DeleteOnSubmit其OrderDetail(多端),其次 DeleteOnSubmit其Order(一端)。因为一端是主键。

var orderDetails =

from o in db.OrderDetails

where o.Order.CustomerID == "WARTH" &&

o.Order.EmployeeID == 3

select o;

var order =

(from o in db.Orders

where o.CustomerID == "WARTH" && o.EmployeeID ==3

select o).First();

foreach (OrderDetail od in orderDetails)

{

db.OrderDetails.DeleteOnSubmit(od);

}

db.Orders.DeleteOnSubmit(order);

db.SubmitChanges();

语句描述语句描述:使用DeleteOnSubmit方法从Order 和Order Details表中删除Order和Order Detail对象。首先从Order Details删除,然后从Orders删除。调用SubmitChanges将此删除保持到数据库。

3.推理删除(Inferred Delete)

说明:Order与OrderDetail是一对多关系,在上面的例子,我们全部删除CustomerID为WARTH和EmployeeID为3 的数据,那么我们不须全部删除呢?例如Order的OrderID为10248的OrderDetail有很多,但是我们只要删除 ProductID为11的OrderDetail。这时就用Remove方法。

Order order = db.Orders.First(x =>x.OrderID == 10248);

OrderDetail od =

order.OrderDetails.First(d => d.ProductID == 11);

order.OrderDetails.Remove(od);

db.SubmitChanges();

语句描述语句描述:这个例子说明在实体对象的引用实体将该对象从其EntitySet 中移除时,推理删除如何导致在该对象上发生实际的删除操作。仅当实体的关联映射将DeleteOnNull设置为true且CanBeNull 为false 时,才会发生推理删除行为。

使用Attach更新(Updatewith Attach)

说明:在对于在不同的 DataContext之间,使用Attach方法来更新数据。例如在一个名为tempdb的 NorthwindDataContext中,查询出Customer和Order,在另一个 NorthwindDataContext中,Customer的地址更新为123 First Ave,Order的 CustomerID 更新为CHOPS。

通常,通过从其他层反序列化 XML 来获取要附加的实体

不支持将实体从一个DataContext附加到另一个DataContext

因此若要复制反序列化实体的操作,将在此处重新创建这 些实体

Customer c1;

List<Order> deserializedOrders = newList<Order>();

Customer deserializedC1;

using (NorthwindDataContext tempdb = newNorthwindDataContext())

{

c1 = tempdb.Customers.Single(c => c.CustomerID =="ALFKI");

deserializedC1 = new Customer

{

Address = c1.Address,

City = c1.City,

CompanyName = c1.CompanyName,

ContactName = c1.ContactName,

ContactTitle = c1.ContactTitle,

Country = c1.Country,

CustomerID = c1.CustomerID,

Fax = c1.Fax,

Phone = c1.Phone,

PostalCode = c1.PostalCode,

Region = c1.Region

};

Customer tempcust =

tempdb.Customers.Single(c => c.CustomerID == "ANTON");

foreach (Order o in tempcust.Orders)

{

deserializedOrders.Add(new Order

{

CustomerID = o.CustomerID,

EmployeeID = o.EmployeeID,

Freight = o.Freight,

OrderDate = o.OrderDate,

OrderID = o.OrderID,

RequiredDate = o.RequiredDate,

ShipAddress = o.ShipAddress,

ShipCity = o.ShipCity,

ShipName = o.ShipName,

ShipCountry = o.ShipCountry,

ShippedDate = o.ShippedDate,

ShipPostalCode = o.ShipPostalCode,

ShipRegion = o.ShipRegion,

ShipVia = o.ShipVia

});

}

}

using (NorthwindDataContext db2 = newNorthwindDataContext())

{

将第一个实体附加到当前数据上下文,以跟踪更改

对Customer更新,不能写错

db2.Customers.Attach(deserializedC1);

更改所跟踪的实体

deserializedC1.Address = "123 First Ave";

附加订单列表中的所有实体

db2.Orders.AttachAll (deserializedOrders);

将订单更新为属于其他客户

foreach (Order o in deserializedOrders)

{

o.CustomerID = "CHOPS";

}

在当前数据上下文中提交更改

db2.SubmitChanges();

}

语句描述:从另一个层中获取实体,使用Attach和AttachAll将反序列化后的实体附加到数据上下文,然后更新实体。更改被提交到数据库。

使用Attach更新和删除(Update and Delete with Attach)

说明:在不同的DataContext中,实现插入、更新、删除。看下面的一个例子:

通常,通过从其他层 反序列化XML获取要附加的实体

此示例使用 LoadWith 在一个查询中预 先加载客户和订单,

并禁用延迟加载

Customer cust = null;

using (NorthwindDataContext tempdb = newNorthwindDataContext())

{

DataLoadOptions shape = new DataLoadOptions();

shape.LoadWith<Customer>(c => c.Orders);

加载第一个客户实体及其订单

tempdb.LoadOptions = shape;

tempdb.DeferredLoadingEnabled = false;

cust = tempdb.Customers.First(x => x.CustomerID =="ALFKI");

}

Order orderA = cust.Orders.First();

Order orderB = cust.Orders.First(x =>x.OrderID > orderA.OrderID);

using (NorthwindDataContext db2 = newNorthwindDataContext())

{

将第一个实体附加到当前数据上下文,以跟踪更改

db2.Customers.Attach(cust);

附加相关订单以进行跟踪; 否则将在提交时插入它们

db2.Orders.AttachAll(cust.Orders.ToList ());

更新客户的Phone.

cust.Phone = "2345 5436";

更新第一个订单OrderA的ShipCity.

orderA.ShipCity = "Redmond";

移除第二个订单 OrderB.

cust.Orders.Remove(orderB);

添加一个新的订单Order到客户Customer中.

Order orderC = new Order() { ShipCity = "New York" };

cust.Orders.Add (orderC);

提交执行

db2.SubmitChanges();

}

语句描述:从一个上下文提取实体,并使用 Attach 和 AttachAll 附加来自其他上下文的实体,然后更新这两个实体,删除一个实体,添加另一个实体。更改被提交到数据库。

这是我所学到的一些知识,在此分享给大家,希望可以帮助到你们。

以上就是我的分享,新手上道,请多多指教。如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值