【问题标题】:DbUpdateConcurrencyException when inserting a single row插入单行时出现 DbUpdateConcurrencyException
【发布时间】:2015-04-27 09:01:29
【问题描述】:

我无法在下面定义的表中插入一行。我必须符合表的复合主键。使用 Entity Framework 向表中插入单行时,我得到了 DbUpdateConcurrencyException。深入挖掘异常,我看到“OriginalValues 不能用于处于已添加状态的实体。”

  • 我先运行 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 文件中将 ProviderManifestToken 设置为“2005”,这似乎可以正常工作。但是,我希望更详细地解释为什么这使它起作用。就我的插入示例而言,2005 年到 2008 年之间发生了什么变化?我希望有更深入的了解。

提前致谢。

【问题讨论】:

    标签: sql-server entity-framework sql-server-2008 sql-server-2005


    【解决方案1】:

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

    您必须了解 Entity Framework 如何处理表中的键。在我的代码中,我设置了 HasDatabaseGeneratedOption。它可以在您的代码中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2019-04-02
      • 2021-11-30
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多