Проблема с linq2sql с этим конкретным положением - PullRequest
0 голосов
/ 08 июля 2010

Используемое программное обеспечение:

Visual Studio 2008 Professional с пакетом услуг 1
Sql Server 2005 Standard Edition (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

и запустите

вы получите недопустимое приведение ошибка

Единственный способ запустить этот код для меня - удалить ссылку между таблицей внутри DBML

есть ли способ сделать эту вставку без удаления связи между таблицами?

Ответы [ 3 ]

0 голосов
/ 08 июля 2010

Я считаю, что Linq2sql не нравится, когда вы устанавливаете идентификатор внешнего ключа напрямую. Он предпочитает устанавливать сам посторонний объект.

test.table_2 = db.Table_2.First(t2 => t2.table2id = 1);
test.tableguid = New Guid("guid from table 1") 
test.table3filler = "a"
0 голосов
/ 09 июля 2010

хорошо, на самом деле это ошибка в .net 3.5 и исправлена ​​в .net 4.0

но есть исправление, подробности см. Здесь

все работает так, как должно, после установки этого исправления

0 голосов
/ 08 июля 2010

Я на самом деле создал вашу базу данных, как вы указали, и запустил именно этот код, он локально на моем компьютере Я не получаю такой ошибки при замене реального GUID в этой строке:

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

Вы уверены, что ваши GUID имеют правильный формат? Вы уверены, что ваши таблицы созданы именно так, как вы указали? Дважды проверьте это ... Я думаю, что если вы воссоздаете этот образец базы данных с нуля, вы не увидите эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...