我无法在下面定义的表格中插入一行。我必须符合表的复合主键。当使用Entity Framework将单个行插入表中时,我得到一个DbUpdateConcurrencyException。深入研究异常我看到“OriginalValues不能用于处于已添加状态的实体。”
下面是我添加行和表架构的代码。
c#code:
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年之间的插入示例有何变化?我希望有更深入的了解。
提前致谢。
答案 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);
}
}