2016-06-09 141 views
0

我試圖使用Linqpad,而不是TSQL,當試圖從表中刪除一些表中的記錄是一個「依賴關係樹」的一部分,跨越可能10-12表。所以我在測試數據庫中創建了一些表格,並且正在試驗DeleteAllOnSubmit和SubmitChanges方法。
我收到FK錯誤。然而,我先刪除子對象。如何刪除FK關係時(不使用FK上的級聯)?刪除記錄使用DeleteAllOnSubmit不與FK contstraints

DELETE語句與REFERENCE約束條件 「FK_OrderItem_Order」衝突。衝突發生於數據庫 「測試」,表 「dbo.OrderItem」,C ...

表:

USE [Test] 
GO 
/****** Object: Table [dbo].[Order] Script Date: 6/9/2016 2:50:18 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[Order](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [OrderNum] [varchar](20) NOT NULL, 
    [Description] [varchar](100) NULL, 
CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
SET ANSI_PADDING OFF 
GO 
/****** Object: Table [dbo].[OrderItem] Script Date: 6/9/2016 2:50:18 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_PADDING ON 
GO 
CREATE TABLE [dbo].[OrderItem](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [OrderId] [int] NOT NULL, 
    [OrderItemName] [varchar](100) NOT NULL, 
    [Qty] [int] NOT NULL, 
CONSTRAINT [PK_OrderItem] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 
SET ANSI_PADDING OFF 
GO 
ALTER TABLE [dbo].[OrderItem] WITH CHECK ADD CONSTRAINT [FK_OrderItem_Order] FOREIGN KEY([OrderId]) 
REFERENCES [dbo].[Order] ([Id]) 
GO 
ALTER TABLE [dbo].[OrderItem] CHECK CONSTRAINT [FK_OrderItem_Order] 
GO 

這裏是我的LINQ語句

List<Order> olist = (from a in Orders where a.Id == 2 select a).ToList(); 
List<int> olistidlist = olist.Select (o => o.Id).ToList(); 

List<OrderItem> oilist = (from a in OrderItems where olistidlist.Contains(a.Id) select a).ToList(); 

//see results before 
olist.Dump(); 

OrderItems.DeleteAllOnSubmit(oilist); 
Orders.DeleteAllOnSubmit(olist); 


//save changes 
SubmitChanges(); 

//see results after 
olist.Dump(); 

回答

1

你是刪除OrderItem其中OrderItem.Id等於olistidlist(目前僅2)中的值。當然,這一定是OrderItem.OrderId

順便說一句,一個簡單的方法來刪除父和子項一般爲:

foreach (var order in Orders.Where(...)) 
{ 
    OrderItems.DeleteAllOnSubmit(order.OrderItems); 
    Orders.DeleteOnSubmit(order); 
} 

所以,你不必走動ID值。