我正在尝试使用Linq将记录插入到表中但得到可怕的 无法使用已在使用的密钥添加实体 错误
'If the same data exists for the same patient in a record less that 21 days old then drop it
Dim RecordLookup As Integer = 0
RecordLookup = (From rc In CDEvodb.RISKCHANGEs _
Where rc.NHI = tmpNHI And _
rc.RECDATE > Date.Now.AddDays(-21) And _
rc.BPSYS = Convert.ToDecimal(Drow.Item("BPSYS")) And _
rc.CHOL = Convert.ToDecimal(Drow.Item("CHOL")) And _
rc.HDL = Convert.ToDecimal(Drow.Item("HDL"))).Count()
If (RecordLookup = 0) Then
Dim riskchange As New RISKCHANGE
riskchange.NHI = Drow.Item("NHI")
riskchange.RECDATE = Date.Now.Date()
riskchange.RISK = CalculatedRisk
riskchange.BPSYS = Drow.Item("BPSYS")
riskchange.CHOL = Drow.Item("CHOL")
riskchange.HDL = Drow.Item("HDL")
Try
CDEvodb.RISKCHANGEs.InsertOnSubmit(riskchange)
Catch ex As Exception
myLogging.OutputError("<" & DateTime.Now.ToString & "> " & "Error - creating risk change record in dataset for patient " & Drow.Item("NHI").ToString() & " - " & ex.Message)
End Try
End If
基本上我在表上查找不到21天的匹配记录(不包括Identity字段)。如果我找不到一个,我创建一个行的实例并设置插入它。
SubmitChanges函数调用几行。
Drow是以前使用SQLClient连接填充的数据集中的DataRow(原因是我尚未完全转换为Linq,现在只是执行新功能)。
提前干杯。
这是表格的创建脚本:
USE [CDEvolution]
GO
/ ******对象:表[dbo]。[RISKCHANGES]脚本日期:05/13/2009 14:40:15 ****** /
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo]。[RISKCHANGES](
[NHI] [varchar](7) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[RECDATE] [datetime] NOT NULL,
[RISK] [numeric](15, 0) NOT NULL,
[BPSYS] [numeric](15, 0) NOT NULL,
[CHOL] [numeric](15, 1) NOT NULL,
[HDL] [numeric](15, 1) NOT NULL,
[POSTED] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[IDENTITY] [uniqueidentifier] NOT NULL CONSTRAINT [DF_RISKCHANGES_IDENTITY]
DEFAULT(newid()),
CONSTRAINT [PK_RISKCHANGES] PRIMARY KEY CLUSTERED
(
[IDENTITY] ASC
)WITH(PAD_INDEX = OFF,IGNORE_DUP_KEY = OFF)ON [PRIMARY]
)ON [PRIMARY]
GO
SET ANSI_PADDING OFF
答案 0 :(得分:9)
如果您更新DBML,请将此( IsDbGenerated =“true”)添加到PK成员:
<Column Name="[IDENTITY]" Member="IDENTITY" Type="System.Guid"
DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true"
CanBeNull="false" IsDbGenerated="true"/>
它将让SQL分配默认值(newid())。
否则它将发送未经授权的guid('00000000-0000-0000-0000-000000000000'),这就是我所知道的问题。
你的另一个选择可能是扩展部分类并初始化OnCreated()事件中的GUID(它不使用列的newid()默认值,但确实解决了问题:
partial class RISKCHANGE
{
partial void OnCreated()
{
_IDENTITY = Guid.NewGuid();
}
}
请注意,对于现有实体(由查询填充),当处理OnLoaded()时,将使用正确的值覆盖此值。
答案 1 :(得分:0)
您在新的Riskchange对象上设置的任何属性是主键属性吗?
另外,在调用SubmitChanges()之前你还做了什么?
欢呼声
修改强>
谢谢凯文。这行是怎么回事?:[IDENTITY] [uniqueidentifier] NOT NULL CONSTRAINT [DF_RISKCHANGES_IDENTITY]
你对PK有什么样的约束......?为什么它看起来不像这样:
[IDENTITY] [int] IDENTITY(1,1) NOT NULL
修改强> 嘿凯文。我认为问题是你没有将你的PK设置为Identity Specifier,因此,它不会自动增加PK。
要解决此问题,请通过更改以下行重新创建表:
[IDENTITY] [uniqueidentifier] NOT NULL CONSTRAINT [DF_RISKCHANGES_IDENTITY]
到此:
[IDENTITY] [int] IDENTITY(1,1) NOT NULL
或者,如果你使用Mangement Studio,只需进入该表的设计。转到该字段的属性,并在属性窗口(通常显示在下面)中将“Idenity Specification”(Is Identity)设置为YES。
不要忘记更新LINQ 2 SQL DBML
答案 2 :(得分:0)
你的主要钥匙是什么?你在桌子上还有其他任何键/约束吗?它可能是导致问题的原因之一。我建议扩大搜索匹配记录或更改约束。