vb.net - InsertOnSubmit = 无法添加具有已在使用的 key 的实体

标签 vb.net linq-to-sql

我尝试使用 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/

相关文章:

c# - 为什么使用此 Linq to Sql 方法会出现 InvalidOperationException?

visual-studio - 有没有办法在 Visual Studio 2008 的 DBML 文件中找到表?

asp.net - 嵌套中继器错误: Object reference not set to an instance of an object

asp.net - 如何访问事件报表的控件(数据动态)

vb.net - 如何在同一数据 GridView 中拖放行

c# - ToDictionary 从第二个表查询返回 Null

c# - 使用 LINQ 和带有输出参数的存储过程丢失小数精度和小数位数

c# - 使用LINQ to SQL读取存储过程

.net - 如何在单元测试 .net 中模拟 ClaimsPrincipal

vb.net - 从vb.net Web服务中运行线程