VB.NET中如何处理InsertOnSubmit时因密钥冲突无法添加实体的问题?

2026-04-29 07:252阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计680个文字,预计阅读时间需要3分钟。

VB.NET中如何处理InsertOnSubmit时因密钥冲突无法添加实体的问题?

我尝试使用Linq将记录插入表中,但遇到了一个无法添加已存在密钥的错误。如果记录中存在相同患者的相同数据且时间不超过21天,则将其删除。代码如下:

csharpDim RecordLookup As IntegerIf the same data exists for the same patient in a record less than 21 days old then drop it

我试图使用 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]

/ ******对象:表[dbo].[RISKCHANGES]脚本日期:05/13/2009 14:40:15 ****** /

SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

SET ANSI_PADDING ON

VB.NET中如何处理InsertOnSubmit时因密钥冲突无法添加实体的问题?

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]

)[主要]

SET ANSI_PADDING OFF

如果更新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()时,将使用正确的值覆盖此值.

本文共计680个文字,预计阅读时间需要3分钟。

VB.NET中如何处理InsertOnSubmit时因密钥冲突无法添加实体的问题?

我尝试使用Linq将记录插入表中,但遇到了一个无法添加已存在密钥的错误。如果记录中存在相同患者的相同数据且时间不超过21天,则将其删除。代码如下:

csharpDim RecordLookup As IntegerIf the same data exists for the same patient in a record less than 21 days old then drop it

我试图使用 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]

/ ******对象:表[dbo].[RISKCHANGES]脚本日期:05/13/2009 14:40:15 ****** /

SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

SET ANSI_PADDING ON

VB.NET中如何处理InsertOnSubmit时因密钥冲突无法添加实体的问题?

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]

)[主要]

SET ANSI_PADDING OFF

如果更新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()时,将使用正确的值覆盖此值.