C# 获得';无法在表';中插入标识列的显式值;OrderPromo';当IDENTITY#U INSERT设置为OFF时;在没有身份的桌子上
我创建了如下表:C# 获得';无法在表';中插入标识列的显式值;OrderPromo';当IDENTITY#U INSERT设置为OFF时;在没有身份的桌子上,c#,sql-server,asp.net-mvc,entity-framework,C#,Sql Server,Asp.net Mvc,Entity Framework,我创建了如下表: USE [OrderMore] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[OrderPromo]( [OrderId] [int] NOT NULL, [PromoId] [int] NOT NULL, [Created] [datetime] NOT NULL, CONSTRAINT [PK_dbo.OrderPromo] PRIMARY KEY C
USE [OrderMore]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[OrderPromo](
[OrderId] [int] NOT NULL,
[PromoId] [int] NOT NULL,
[Created] [datetime] NOT NULL,
CONSTRAINT [PK_dbo.OrderPromo] PRIMARY KEY CLUSTERED
(
[OrderId] 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
ALTER TABLE [dbo].[OrderPromo] WITH CHECK ADD CONSTRAINT [FK_dbo.OrderPromo_dbo.Order_OrderId] FOREIGN KEY([OrderId])
REFERENCES [dbo].[Order] ([OrderID])
GO
ALTER TABLE [dbo].[OrderPromo] CHECK CONSTRAINT [FK_dbo.OrderPromo_dbo.Order_OrderId]
有趣的实体如下所示:
[Table("OrderPromo")]
public class OrderPromo : EntityBase
{
/// <summary>
///
/// </summary>
[Key, ForeignKey("Order")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int OrderId { get; set; }
/// <summary>
///
/// </summary>
public int PromoId { get; set; }
/// <summary>
///
/// </summary>
public virtual Order Order { get; set; }
}
您可以尝试像这样打开IDENTITY_INSERT
SET IDENTITY_INSERT Order ON
--Insert script here
SET IDENTITY_INSERT Order OFF
您将OrderId声明为表OrderPromo中的主键,尽管它似乎是外键。它应该是表顺序的主键 从OrderPromo中删除OrderId上的主键,它应该可以工作
我相信现在的情况是,insert试图将引用订单的值强制放入OrderPromo的OrderId字段中,导致它失败。这些表上有触发器吗?这两个表上都没有触发器。
Order
?@Christos OrderPromo上的PK是OrderId。我建议找出EF生成的确切sql,以确定到底发生了什么。还必须尝试在SSMS中的OrderPromo
上运行insert命令?错误表明问题出在OrderPromo上,而不是订单本身。我无法在OrderPromo上设置IDENTITY\u INSERT
,因为没有IDENTITY
。为什么/如何改变订单?您能发布订单促销定义吗?如果OrderPromo没有标识,影响它是没有意义的为什么在OrderPromo表中为OrderID聚集了主键?这是与订单表的一对一关系吗?使用OrderId和PromoId组合作为主键怎么样?@TonyDong这就是EF迁移的设置方式。OrderPromo是一对一的Order。能否将OrderPromo ID添加到OrderPromo表中,并将其作为主键,将OrderID作为外键?这会将关系从一更改为一,或从零更改为一对多。此外,EF不能很好地处理没有主键的表。OrderID也是Order表的主键。“我相信现在发生的事情是插入试图将引用订单的值强制输入OrderPromo的OrderId字段中。”。这正是我认为应该发生的事情。你应该重新考虑你的设计。我想象一个订单Id唯一地标识一个订单,而不是一个订单促销。如果您的关系是一对一,那么您最好将字段移动到订单表,不是吗?您可以通过添加自己的PK字段轻松解决EF需要PK的问题,这是推荐的方法。
USE [OrderMore]
GO
/****** Object: Table [dbo].[Order] Script Date: 01/05/2017 10:57:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Order](
[OrderID] [int] IDENTITY(1,1) NOT NULL,
[OrderFormID] [int] NOT NULL,
[Notes] [nvarchar](250) NULL,
[Created] [datetime] NOT NULL,
[TransactionID] [int] NOT NULL,
[OrderSequenceContext] [int] NOT NULL DEFAULT ((0)),
CONSTRAINT [PK_dbo.Order] PRIMARY KEY CLUSTERED
(
[OrderID] 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
ALTER TABLE [dbo].[Order] WITH CHECK ADD CONSTRAINT [FK_dbo.Order_dbo.Transaction_TransactionID] FOREIGN KEY([TransactionID])
REFERENCES [dbo].[Transaction] ([TransactionID])
GO
ALTER TABLE [dbo].[Order] CHECK CONSTRAINT [FK_dbo.Order_dbo.Transaction_TransactionID]
SET IDENTITY_INSERT Order ON
--Insert script here
SET IDENTITY_INSERT Order OFF