Linq to sql 具有此特定结构的linq2sql出现问题
使用的软件: Visual studio 2008专业版及服务包1Linq to sql 具有此特定结构的linq2sql出现问题,linq-to-sql,.net-3.5,Linq To Sql,.net 3.5,使用的软件: Visual studio 2008专业版及服务包1 Sql Server 2005标准版(9.00.4266.00) WindowsXPSP3 我有三张桌子: GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[Table_2]( [table2id] [int]
Sql Server 2005标准版(9.00.4266.00) WindowsXPSP3 我有三张桌子:
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
现在打开一个新的web应用程序项目,创建一个新的dbml并拖放这3个表
现在只需将代码放入网页codebehind中
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
然后运行它
您将得到一个无效的强制转换错误
到目前为止,我能够运行该代码的唯一方法是删除DBML中表之间的链接
有没有一种方法可以在不删除表之间链接的情况下进行插入?我实际上按照您的指定创建了数据库,并在我的框中本地运行了这段代码。当我在这一行中替换实际GUID时,我没有收到这样的错误:
test.tableguid = New Guid("guid from table 1")
你确定你的guid格式正确吗?是否确实创建的表与指定的完全相同?仔细检查一下。。。我的猜测是,如果您从头开始重新创建这个示例db,您将不会看到这个问题 我相信Linq2sql不喜欢直接设置外键id。它希望您设置外部对象本身
test.table_2 = db.Table_2.First(t2 => t2.table2id = 1);
test.tableguid = New Guid("guid from table 1")
test.table3filler = "a"
好的,它实际上是.NET3.5中的一个bug,并用.NET4.0修复 但是有一个修补程序
安装修补程序后,一切正常运行我更新了sql脚本,自动插入新行并返回密钥,但仍然出现无效强制转换错误。对我来说,插入的唯一方法是删除每个表之间的dbml文件中的链接。看我自己的答案,这实际上是一个错误。看我自己的答案,这实际上是一个错误