我正在尝试使用Entity Framework在表中使用自定义标识列。我所拥有的是一个用于控制下一个可用于每个表的Id的表。
CREATE TABLE [dbo].[SystemNumbers](
[SystemNumberDesc] [varchar](30) NOT NULL,
[LastId] [Int] NOT NULL
CONSTRAINT [PK__SystemNumbers] PRIMARY KEY CLUSTERED
(
[SystemNumberDesc] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
,其中一行包含表格的行计数器,插入如下
INSERT INTO SystemNumbers VALUES ('WS', 0)
然后我创建了我想要使用的表
CREATE TABLE [dbo].[WS](
[WorkstationID] INT NOT NULL,
[WorkstationName] [varchar](50) NULL,
[WSTS] TIMESTAMP,
CONSTRAINT [PK_WS] PRIMARY KEY CLUSTERED
(
[WorkstationID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO
然后创建触发器以从SystemCounters
表中获取下一个ID并更新ID,如下所示
CREATE TRIGGER WSId
ON WS AFTER INSERT
AS BEGIN
DECLARE @LastId INT
DECLARE @TableName VARCHAR(100)
DECLARE @INSERTID INT
SET @TableName = 'WS'
SET NOCOUNT ON
SELECT @INSERTID = SystemID, @CREATETS = SystemTS, @StoreId = StoreId FROM Inserted
IF (@INSERTID = 0) BEGIN
SELECT @LastId = LastId + 1 FROM SystemNumbers WHERE SystemNumberDesc = @TableName
UPDATE SystemNumbers SET LastId = @LastId WHERE SystemNumberDesc = @TableName
UPDATE WS SET SystemId = @LastId, WorkstationID=@LastId WHERE SystemId = @INSERTID
END
END
GO
使用SQL执行插入可以正常工作。然后,我将ADO.Net实体框架添加到我的项目中,并尝试插入记录。
这给我一个初始问题,即列被定义为Computed,需要更改为Identity。我改变了这个然后得到
EntityFramework.dll中发生未处理的“System.Data.Entity.Infrastructure.DbUpdateConcurrencyException”类型异常
其他信息:存储更新,插入或删除语句会影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。
我怀疑这是因为它插入了记录,然后尝试重新加载它以获取Db值,例如时间戳。
我已经跟随了一些线程,但刚刚结束了一圈。我需要从表中设置列,因为它是多存储的,因此Identity字段将不起作用。