如何在SQL中使用Entity Framework的自定义标识列

时间:2014-07-13 17:17:35

标签: sql entity-framework dbcontext

我正在尝试使用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字段将不起作用。

0 个答案:

没有答案