LINQ a IDENTITY_INSERT   zodpovězená otázka

C#, SQL, Databáze

Dobré ráno.

Dostal jsem se do situace, kdy potřebuji starou databázi, která nebyla navržena přesně podle toho, jak bych si představoval, do nové. Pro převod chci využít IDENTITY_INSERT. Napsal jsem si funkci která vypadá takto :

public static void TransferMajitelLisu()
        {
            using (var dc = new gschDataContext())
            {
                List<gsch_MajitelLisu> majitelLisuList = new List<gsch_MajitelLisu>();
                var oldMajitelLisu = from m in dc.MajitelLisus
                                     select m;
                dc.ExecuteCommand("SET IDENTITY_INSERT gsch_MajitelLisu ON ");
                foreach (var m in oldMajitelLisu)
                {
                    gsch_MajitelLisu novyMajitel = new gsch_MajitelLisu();
                    novyMajitel.MajitelID = m.MajitelID;
                    novyMajitel.MajitelName = m.MajitelName;
                    novyMajitel.Deleted = false;
                    majitelLisuList.Add(novyMajitel);
                }

                dc.gsch_MajitelLisus.InsertAllOnSubmit(majitelLisuList);
                dc.SubmitChanges();
                dc.ExecuteCommand("SET IDENTITY_INSERT gsch_MajitelLisu OFF ");

                
                
            }
            

        }

Bohužel po zapnutí funkce se mi do databáze údaje přidají s MajitelID, které má normálně následovat a ne s MajitelID, které převzal z původní databáze. Může někdo poradit, kde je problém ?

Předem moc děkuji.

S pozdravem

Tomáš

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co je to za databázi? Nemáte tam ve sloupci MajitelID nastaveno Auto increment?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den.

Jedná se o databázi MSSQL, o čemž vypovídá i používání LINQ to SQL, které je určeno pro MSSQL.

Automatickou inkrementaci mám, kvůli tomu používám IDENTITY_INSERT, abych mohl zapsat údaje přesně tak, jak chci. Pokud si to napíšu v T-SQL tak to funguje správně:

SET IDENTITY_INSERT [dbo].[gsch_MajitelLisu] ON
INSERT [dbo].[gsch_MajitelLisu] ([Deleted], [MajitelID], [MajitelName]) VALUES (0, 1, N'Barum Continental')
INSERT [dbo].[gsch_MajitelLisu] ([Deleted], [MajitelID], [MajitelName]) VALUES (0, 2, N'Mitas Otrokovice')
INSERT [dbo].[gsch_MajitelLisu] ([Deleted], [MajitelID], [MajitelName]) VALUES (0, 3, N'Chemitan')
SET IDENTITY_INSERT [dbo].[gsch_MajitelLisu] OFF

A představa že bych převáděl databázi o 50ti tabulkách a před převedením databáze bych všude musel vypnout inkrementaci a pak ji zapnout mi nepřipadá jako normální věc. Takže v tom si myslím problém nebude.

S pozdravem

Tomáš

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jinak to neuděláte. Leda vytvořit auto increment sloupce až po nalití dat.

Důvod, proč se Vám to nezdá jako normální věc je ta, že pro kopírování databáze se běžně nepoužívá kopírování fyzických dat a to hned z několika důvodů. Pokud to ale jinak nejde, musíte to dělat takto. Vkládat automaticky generovaný klíč není správné a přidává to další práci databázi a proto to lze jen při explicitním vynucení nastavením IDENTITY_INSERT.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nakonec jsem to vyřešil tak, že jsem si přes LINQ to SQL natáhnul data a pak pomocí ADO.NET jsem je tam nacpal. Bohužel nejde převzít celou databázi, protože se rozšiřovala o dodatečnou funkčnost a měnila se struktura. Nicméně požadavek na zachování dat je, a proto jsem se dostal do tohoto problému. Díky za podmětné vysvětlení problému. Zase jsem o něco chytřejší.

Děkuji

S pozdravem

Tomáš

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback