2010-07-08 1 views
0

Logiciel utilisé:Problème avec linq2sql avec ce stituation spécifique

Visual Studio 2008 Professional avec les services Pack 1
SQL Server 2005 Standard Edition (9.00.4266.00) Windows XP SP3

J'ai ces 3 tableaux :

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 

maintenant ouvrir un nouveau projet d'applications Web, créez un nouveau dbml et faites glisser & tomber ces 3 tables

maintenant vient de mettre ce code dans une page Web 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 

et l'exécuter

vous obtiendrez un casting invalide erreur

seule façon à ce jour pour moi d'être en mesure d'exécuter ce code est de supprimer le lien entre la table à l'intérieur de la DBML

est-il un moyen de faire t chapeau insérer sans enlever le lien entre les tables?

Répondre

0

ok, il est en fait un bug avec .net 3.5 et corrigé avec .net 4.0

mais il y a un correctif, see detail here

tout fonctionne comme il se doit après le correctif est installé

0

J'ai effectivement créé votre base de données comme vous l'avez spécifié et j'ai exécuté exactement ce code localement sur ma boîte. Je reçois aucune erreur lorsque je remplace le véritable GUID dans cette ligne:

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

Etes-vous sûr votre GUIDs êtes dans le bon format? Êtes-vous sûr que vos tableaux sont créés exactement comme vous l'avez spécifié? Double vérifier ... Je suppose que si vous recréez cet exemple de base de données, vous ne verrez pas ce problème.

+0

J'ai mis à jour mon script SQL pour insérer automatiquement une nouvelle ligne et retourner la clé, je reçois toujours l'erreur de distribution invalide. La seule façon pour moi de faire l'insertion est de supprimer le lien dans le fichier dbml entre chaque table – Fredou

+0

voir ma propre réponse, c'est en fait un bug – Fredou

+0

ah, je l'avais testé en 4.0 ... –

0

Je crois que Linq2sql ne l'aime pas lorsque vous définissez un identifiant de clé étrangère directement. Il préfère que vous définissiez l'objet étranger lui-même.

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

voir ma propre réponse, c'est en fait un bug – Fredou