我尝试使用 Linq 将记录插入到表中,但出现了可怕的无法使用已在使用的 key 添加实体错误
'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 天以内的匹配记录(不包括“身份”字段)。如果找不到,我会创建一个行实例并设置为插入它。
SubmitChanges 函数在接下来的几行中被调用。
Drow 是来自之前使用 SQLClient 连接填充的数据集的 DataRow(原因是我还没有完全转换为 Linq,现在只是执行新功能)。
提前干杯。
<小时/>这是表的创建脚本:
USE [CDEvolution]
开始
/***** 对象:表 [dbo].[RISKCHANGES] 脚本日期:05/13/2009 14:40:15 ******/
设置 ANSI_NULLS 为开
开始
将 QUOTED_IDENTIFIER 设置为开
开始
设置 ANSI_PADDING 为开
开始
创建表 [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]
默认(newid()),
约束[PK_RISKCHANGES]主键聚集
(
[IDENTITY] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
)在[主要]
开始
设置 ANSI_PADDING 关闭
最佳答案
如果您更新 DBML,请将其 (IsDbGenerate="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() 时,该值将被正确的值覆盖。
关于vb.net - InsertOnSubmit = 无法添加具有已在使用的 key 的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/855738/