在 .map 檔中設定關聯級聯刪除:
<Association Name="FK_Order_Details_Orders" Member="OrderDetails" Storage="_OrderDetails"
ThisKey="OrderID" OtherKey="OrderID" DeleteRule="ON DELETE CASCADE" />
預期:刪除 Order 時自動先刪除關聯 Order_Details。
實際:拋出 SqlException: DELETE 陳述式與 REFERENCE 約束 "FK_Order_Details_Orders" 衝突。
string con = "server=.;database=Northwind;uid=sa;pwd=xxx";
string xmlPath = @"D:\MapNorthwind.xml";
XmlMappingSource mapping = XmlMappingSource.FromXml(File.ReadAllText(xmlPath));
using (var ctx = new NorthwindDataContext(con, mapping))
{
var orders = ctx.Orders.Where(o => o.OrderID == 10250);
ctx.Orders.DeleteAllOnSubmit(orders);
ctx.SubmitChanges(); // 此處拋出例外
}
CreateDatabase() 產生 DDL 時加入 ON DELETE CASCADE 子句,不影響運行時刪除行為。CreateDatabase 行為。var order = ctx.Orders.Single(o => o.OrderID == 10250);
ctx.OrderDetails.DeleteAllOnSubmit(order.OrderDetails); // 先刪明細
ctx.Orders.DeleteOnSubmit(order);
ctx.SubmitChanges();
ALTER TABLE [Order Details] DROP CONSTRAINT FK_Order_Details_Orders;
ALTER TABLE [Order Details] ADD CONSTRAINT FK_Order_Details_Orders
FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) ON DELETE CASCADE;
再搭配 DeleteOnNull="true" 於關聯屬性:
<Association ... DeleteOnNull="true" />
允許實體在記憶體中成為「孤兒」,提交時由資料庫級聯刪除。