我无法在下面定义的表中插入行。我必须符合表的复合主键。使用实体框架将单行插入表中时,我得到一个 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);
}
}