【发布时间】:2017-05-30 05:17:19
【问题描述】:
我在使用 C# 实体框架在 Temporal table 中插入数据时遇到问题
表架构是
CREATE TABLE People(
PeopleID int PRIMARY KEY NOT NULL,
Name varchar(50) Null,
LastName varchar(100) NULL,
NickName varchar(25),
StartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL,
EndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME (StartTime,EndTime)
) WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE = dbo.PeopleHistory));
我创建了一个 EDMX asusal,并尝试使用以下 C# 代码插入记录
using (var db = new DevDBEntities()) {
People1 peo = new People1() {
PeopleID = 1,
Name = "Emma",
LastName = "Watson",
NickName = "ICE"
};
db.Peoples.Add(peo);
db.SaveChanges();
}
我在 db.SaveChanges()
"不能在 GENERATED ALWAYS 列中插入显式值 表'DevDB.dbo.People'。将 INSERT 与列列表一起使用以排除 GENERATED ALWAYS 列,或将 DEFAULT 插入 GENERATED ALWAYS 列。”
我尝试使用 SQL Server 使用以下插入查询直接插入,它的插入很好。
INSERT INTO [dbo].[People]
([PeopleID]
,[Name]
,[LastName]
,[NickName])
VALUES
(2
,'John'
,'Math'
,'COOL')
请帮助我如何使用 C# Entity Framework 插入记录。
【问题讨论】:
-
尝试在 EDMX 文件中将
StoreGeneratedPatternforPeopleID更改为Identity或Computed(在 GUID 的情况下)并实现IDbCommandTreeInterceptor以使用以下方法删除临时表中的主键列插入尝试字符串集合。 -
@TetsuyaYamamoto - 失败(即抛出相同的异常)
-
我的错,我完全错过了
StartTime和EndTime都是带有GENERATED ALWAYS的自动生成的列 - 将这些列的StoreGeneratedPattern设置为Identity。当然,您需要实现额外的自定义命令树拦截器,实现IDbCommandTreeInterceptor来处理这些自动生成的列,可能需要比此评论更多的解释。 -
@TetsuyaYamamoto - 请您在回答部分提供完整代码帮助我。
标签: c# sql-server entity-framework entity-framework-6 temporal-database