没有在Entity.Add上求值的唯一约束

本文关键字:唯一 约束 Entity Add | 更新日期: 2023-09-27 18:13:41

下面的表在SQL中工作,我的意思是我可以添加行,如果有重复,它提示我不能插入。当尝试插入实体框架时,数据确实被添加到本地存储,使用命令:

 tblOrderDetail ord = new tblOrderDetail();
                        ord.FK_ServiceID = cboService.ToSelectedIntValue();
                        ord.FK_QuoteID = primKey;
                        ord.Quantity = txtServiceQuant.ToInt();
                        ord.LineTotal = txtServiceQuant.ToInt() * txtServiceUnit.ToDecimal();                      
contx.tblOrderDetails.Add(ord); 

如果我尝试保存更改,如下所示,如果它是一个唯一的行,一切工作完美。另外,如果我试图保存已经存在的行,我会得到唯一约束的错误。

在此之后,如果我尝试插入另一个唯一的订单详细信息行,我会得到一个错误的唯一约束的前一行,没有提交到DB。

这是因为本地商店中还有副本吗?还是我错过了什么?

contx.SaveChanges();

保存更改,出现以下错误:

CREATE TABLE [dbo].[tblOrderDetail](
    [PK_OrderDetailID] [int] IDENTITY(1,1) Primary Key NOT NULL,
    [FK_ServiceID] [int] NULL,
    [FK_ProductID] [int] NULL,
    [FK_QuoteID] [int] NULL,
    [FK_InvoiceID] [int] NULL,
    [Quantity] [money] NOT NULL,
    [LineTotal] [money] NOT NULL,
    [Deleted] [bit] NULL,
 CONSTRAINT [uc_InvoiceQuoteProductService] UNIQUE NONCLUSTERED 
(
    [FK_InvoiceID] ASC,
    [FK_QuoteID] ASC,
    [FK_ServiceID] ASC,
    [FK_ProductID] ASC
))
GO
    Go
ALTER TABLE [dbo].[tblOrderDetail] ADD  CONSTRAINT [DF_tblOrderDetail_Deleted]  DEFAULT ((0)) FOR [Deleted]
GO
ALTER TABLE [dbo].[tblOrderDetail]  WITH CHECK ADD FOREIGN KEY([FK_InvoiceID])
REFERENCES [dbo].[tblInvoice] ([PK_InvoiceID])
GO
ALTER TABLE [dbo].[tblOrderDetail]  WITH CHECK ADD FOREIGN KEY([FK_QuoteID])
REFERENCES [dbo].[tblQuote] ([PK_QuoteID])
GO
ALTER TABLE [dbo].[tblOrderDetail]  WITH CHECK ADD FOREIGN KEY([FK_ServiceID])
REFERENCES [dbo].[tblService] ([PK_ServiceID])
GO

SET IDENTITY_INSERT [dbo].[tblOrderDetail] ON 
INSERT [dbo].[tblOrderDetail] ([PK_OrderDetailID], [FK_ServiceID], [FK_ProductID], [FK_QuoteID], [FK_InvoiceID], [Quantity], [LineTotal], [Deleted]) VALUES (1,1, NULL, 1, NULL, 12.0000, 3000.0000, NULL)
INSERT [dbo].[tblOrderDetail] ([PK_OrderDetailID], [FK_ServiceID], [FK_ProductID], [FK_QuoteID], [FK_InvoiceID], [Quantity], [LineTotal], [Deleted]) VALUES (2,2, NULL, 2, NULL, 1.0000, 300.0000, NULL)
INSERT [dbo].[tblOrderDetail] ([PK_OrderDetailID], [FK_ServiceID], [FK_ProductID], [FK_QuoteID], [FK_InvoiceID], [Quantity], [LineTotal], [Deleted]) VALUES (3,3, NULL, 5, NULL, 4.0000, 600.0000, NULL)
INSERT [dbo].[tblOrderDetail] ([PK_OrderDetailID], [FK_ServiceID], [FK_ProductID], [FK_QuoteID], [FK_InvoiceID], [Quantity], [LineTotal], [Deleted]) VALUES (4,4, NULL, 5, NULL, 8.0000, 4000.0000, NULL)
INSERT [dbo].[tblOrderDetail] ([PK_OrderDetailID], [FK_ServiceID], [FK_ProductID], [FK_QuoteID], [FK_InvoiceID], [Quantity], [LineTotal], [Deleted]) VALUES (5,5, NULL, 5, NULL, 6.0000, 2700.0000, NULL)
SET IDENTITY_INSERT [dbo].[tblOrderDetail] OFF

The Inner Inner Message如下:

{"违反了UNIQUE KEY约束'uc_InvoiceQuoteProductService'。无法在对象'dbo.tblOrderDetail'中插入重复键。重复键值为(,4,2,)。'r'n语句已终止。"}

异常堆栈

:

   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at WWITIQ.PresentationLayer.Windows.pgeQuotes.btnAddServices_Click_1(Object sender, RoutedEventArgs e) in c:'Users'...

没有在Entity.Add上求值的唯一约束

如果你仍然处于"相同"的上下文中,你必须首先从上下文中分离出有问题的实体,然后再尝试保存。

如果不这样做,它仍然会附加到上下文,并且SaveChanges将应用于所有附加的实体。

试着这样写:

contx.Entry(<theEntityWhichBreaksUnicityConstraint>).State = EntityState.Detached;