【问题标题】:Issue with linq2sql with this specific stituation在这种特定情况下 linq2sql 出现问题
【发布时间】:2010-07-08 12:31:25
【问题描述】:

使用的软件:

Visual Studio 2008 Professional 服务包 1
Sql Server 2005 标准版 (9.00.4266.00) Windows XP SP3

我有这 3 张桌子:

    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Table_2](
        [table2id] [int] IDENTITY(1,1) NOT NULL,
        [table2filler] [varchar](max) NULL,
     CONSTRAINT [PK_Table_2] PRIMARY KEY CLUSTERED 
    (
        [table2id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[Table_1](
        [table1id] [int] IDENTITY(1,1) NOT NULL,
        [table1guid] [uniqueidentifier] NOT NULL,
     CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED 
    (
        [table1id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    CREATE UNIQUE NONCLUSTERED INDEX [IX_Table_1] ON [dbo].[Table_1] 
    (
        [table1guid] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    SET ANSI_PADDING ON
    GO
    CREATE TABLE [dbo].[Table_3](
        [tableguid] [uniqueidentifier] NOT NULL,
        [table2id] [int] NOT NULL,
        [table3filler] [varchar](max) NULL,
     CONSTRAINT [PK_Table_3] PRIMARY KEY CLUSTERED 
    (
        [tableguid] ASC,
        [table2id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    GO
    SET ANSI_PADDING OFF
    GO
    ALTER TABLE [dbo].[Table_3]  WITH CHECK ADD  CONSTRAINT [FK_Table_3_Table_1] FOREIGN KEY([tableguid])
    REFERENCES [dbo].[Table_1] ([table1guid])
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[Table_3] CHECK CONSTRAINT [FK_Table_3_Table_1]
    GO
    ALTER TABLE [dbo].[Table_3]  WITH CHECK ADD  CONSTRAINT [FK_Table_3_Table_2] FOREIGN KEY([table2id])
    REFERENCES [dbo].[Table_2] ([table2id])
    ON DELETE CASCADE
    GO
    ALTER TABLE [dbo].[Table_3] CHECK CONSTRAINT [FK_Table_3_Table_2]
    GO

    INSERT INTO [dbo].[Table_2]
               ([table2filler])
         VALUES
               ('test')
    print 'table2id:'
    print scope_identity()

    GO

    declare @guid uniqueidentifier
    set @guid=newid()
    print 'table1guid:'
    print @guid

    INSERT INTO [dbo].[Table_1]
           ([table1guid])
     VALUES
           (@guid)

    GO

现在打开一个新的网络应用项目,创建一个新的 dbml 并拖放这 3 个表

现在只需将该代码放在网页代码隐藏中

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim test As New Table_3

    Dim db As New DataClasses1DataContext

    test.table2id = 1
    test.tableguid = New Guid("guid from table 1")
    test.table3filler = "a"

    db.Table_3s.InsertOnSubmit(test)
    db.SubmitChanges()

End Sub

并运行它

你会得到一个invalid cast错误

到目前为止,我能够运行该代码的唯一方法是删除 DBML 内的表之间的链接

有没有办法在不删除表之间的链接的情况下进行插入?

【问题讨论】:

    标签: linq-to-sql .net-3.5


    【解决方案1】:

    我实际上按照您指定的方式创建了您的数据库,并在我的机器上本地运行此代码。当我在这一行中替换一个真正的 GUID 时,我没有收到这样的错误:

       test.tableguid = New Guid("guid from table 1")
    

    您确定您的 GUID 格式正确吗?您确定您的表格完全按照您指定的方式创建吗?仔细检查...我的猜测是,如果您从头开始重新创建此示例数据库,您将不会看到此问题。

    【讨论】:

    • 我更新了我的 sql 脚本以自动插入新行并返回密钥,但我仍然收到无效转换错误。我进行插入的唯一方法是删除每个表之间的 dbml 文件中的链接
    • 看我自己的回答,其实是个bug
    【解决方案2】:

    我相信 Linq2sql 不喜欢直接设置外键 id。它更喜欢你自己设置外来对象。

    test.table_2 = db.Table_2.First(t2 => t2.table2id = 1);
    test.tableguid = New Guid("guid from table 1") 
    test.table3filler = "a"
    

    【讨论】:

    • 看我自己的回答,其实是个bug
    【解决方案3】:

    好的,这实际上是 .net 3.5 的一个错误,并已在 .net 4.0 中修复

    但有一个修补程序,see detail here

    安装该修补程序后一切正常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多