DbUpdateConcurrencyException 插入单行时



我无法在下面定义的表中插入行。我必须符合表的复合主键。使用实体框架将单行插入表中时,我得到一个 DbUpdateConcurrencyException。深入研究异常,我看到"原始值不能用于处于"已添加"状态的实体。

  • 我首先运行EF 6.1.3数据库
  • 我的数据库是 SQl 2008,集合在兼容模式下 2005。

下面是我用于添加行和表架构的代码。

C# 代码:

Entities.Entry(new jotch_krdtrans() {Kred = 1, Regdato = DateTime.Now}).State = EntityState.Added;
Entities.SaveChanges();

SQL 表架构:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[jotch_krdtrans](
    [Kred] [decimal](12, 0) NOT NULL,
    [Regdato] [datetime] NOT NULL,
    [Autonum] [decimal](18, 0) IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_jotch_krdtrans] PRIMARY KEY CLUSTERED 
(
    [Kred] ASC,
    [Regdato] ASC,
    [Autonum] 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

我尝试在我的 edmx 文件中将提供程序清单令牌设置为"2005",这似乎使其工作。但是,我更喜欢更详细的解释为什么这会使其起作用。2005 年至 2008 年间与我的插入示例相比发生了什么变化?我希望有更深入的理解。

提前谢谢。

您必须在数据库表中使用 datetime2(7) 而不是 datetime。

您必须了解实体框架如何处理表中的键。在我的代码中,我设置了HasDatabaseGenerated Option。它可以在你的代码中出现。

 public class IceCatCategoryMap : EntityTypeConfiguration<IceCatCategory>
 {
    public IceCatCategoryMap()
    {
        ToTable("SemlerServices_IceCatCategory");
        HasKey(m => m.Id);
        Property(m => m.Id).IsRequired().HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    }
}   

最新更新