插入单行

时间:2015-04-27 09:01:29

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

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

  • 我首先运行EF 6.1.3数据库
  • 我的数据库是SQl 2008,已设置 在兼容模式2005年。

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

c#c​​ode:

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年之间的插入示例有何变化?我希望有更深入的了解。

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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

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