2016-06-09 13 views
0

Ich versuche Linqpad zu verwenden, LINQ anstelle von TSQL zu verwenden, wenn Sie versuchen, einige Datensätze aus einer Tabelle zu entfernen, die Teil einer Abhängigkeitsbaumstruktur ist, die wahrscheinlich 10-12 Tabellen umfasst . Also habe ich einige Tabellen in einer Test-DB erstellt und experimentiere mit den Methoden DeleteAllOnSubmit und SubmitChanges.
Ich bekomme einen FK-Fehler. Ich lösche jedoch zuerst die untergeordneten Objekte. Wie lösche ich, wenn FK-Beziehungen vorhanden sind (ohne Kaskadierung auf den FKs zu verwenden)?Löschen von Datensätzen mit DeleteAllOnSubmit funktioniert nicht mit FK Constraints

Die DELETE-Anweisung steht im Konflikt mit der REFERENCE-Einschränkung "FK_OrderItem_Order". Der Konflikt trat in Datenbank "Test", Tabelle "dbo.OrderItem", c ...

Tables:

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 

Hier ist meine LINQ-Anweisung

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(); 

Antwort

1

Sie sind Löschen OrderItem s, von denen die OrderItem.Id ist gleich den Werten in olistidlist (nur 2, derzeit). Natürlich muss dies OrderItem.OrderId sein.

By the way, ein einfacher Weg, Eltern und Kind Elemente löschen im Allgemeinen ist:

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

Sie müssen also nicht mit Id-Werte bewegen.

Verwandte Themen