c# मतद विभिन्न मशीनों से निर्माण करते समय कोड पहले डीबीमिगरेटर त्रुटि का कारण बनता है




वोटिंग मशीन 2017 (4)

हमारे पास एससीएम के तहत एक परियोजना है। जब मैं इसे अपनी मशीन से बनाता हूं और msdeploy के माध्यम से रिमोट सर्वर पर प्रकाशित करता हूं, तो सब कुछ ठीक काम करता है।

जब मेरे सहयोगी एक ही प्रोजेक्ट के साथ एक ही चीज की कोशिश करता है, तो रिमोट सर्वर इकाई ढांचे पर एससीएम से ताजा खींच लिया जाता है 4.3.1 DbMigrator फेंकता है:

स्वचालित माइग्रेशन लागू नहीं किया गया था क्योंकि इसका परिणाम डेटा हानि होगा।

जैसा कि यह पता चला है, ऐसा लगता है कि वह व्यक्ति जो दूरस्थ सर्वर पर प्रारंभिक प्रकाशन बनाता है वह "विजेता" है। अगर हम दूरस्थ सर्वर पर डेटाबेस छोड़ देते हैं, तो मेरा सहयोगी प्रकाशित कर सकता है और मैं लॉक हो जाता हूं। मेरे प्रकाशनों के परिणामस्वरूप ऊपर एक ही त्रुटि है।

DbMigrator लिए कॉन्फ़िगर कुछ ऐसा दिखता है:

        var dbMgConfig = new DbMigrationsConfiguration()
        {
            AutomaticMigrationsEnabled = true,
            //***DO NOT REMOVE THIS LINE, 
            //DATA WILL BE LOST ON A BREAKING SCHEMA CHANGE,
            //TALK TO OTHER PARTIES INVOLVED IF THIS LINE IS CAUSING PROBLEMS    
            AutomaticMigrationDataLossAllowed=false,
            //***DO NOT REMOVE THIS LINE,
            ContextType = typeof(TPSContext),
            MigrationsNamespace = "TPS.Migrations",
            MigrationsAssembly = Assembly.GetExecutingAssembly()
        };

मुझे लगता है कि इसकी नई तालिका __MigrationHistory और अपनी पंक्तियों में संग्रहित गंदा लग रही लंबी हेक्स स्ट्रिंग के साथ कुछ करने के लिए कुछ है।

मैं जीने के लिए प्रकाशन के लिए पूर्ण जिम्मेदारी नहीं लेना चाहता हूं। मैं किसके लिए देख सकता हूं?


हमने अपना कोड बदल दिया:

        dbMgConfig.AutomaticMigrationDataLossAllowed = false;
        var mg = new DbMigrator(dbMgConfig);
        mg.Update(null);

सेवा मेरे

        dbMgConfig.AutomaticMigrationDataLossAllowed = true;
        var mg = new DbMigrator(dbMgConfig);
        var scriptor = new MigratorScriptingDecorator(mg);
        string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null);
        throw new Exception(script);

ताकि हम देख सकें कि DbMigrator रिमोट सर्वर पर क्या प्रयास कर रहा है।

इस प्रश्न की शुरुआत में उल्लिखित मामले में (यानी सहयोगी अपलोड करता है जो डेटाबेस बनाता है, उसके बाद मुझे एक ही स्रोत से एक ही स्रोत से उत्पन्न अपलोड बनाते हैं), निम्नलिखित SQL कथन उत्पन्न होते हैं:

ALTER TABLE [GalleryImages] DROP CONSTRAINT [FK_GalleryImages_Galleries_Gallery_Id]
ALTER TABLE [GalleryImages] DROP CONSTRAINT [FK_GalleryImages_Images_Image_Id]
ALTER TABLE [UserLightboxes] DROP CONSTRAINT [FK_UserLightboxes_Users_User_Id]
ALTER TABLE [UserLightboxes] DROP CONSTRAINT [FK_UserLightboxes_Lightboxes_Lightbox_Id]
ALTER TABLE [ImageLightboxes] DROP CONSTRAINT [FK_ImageLightboxes_Images_Image_Id]
ALTER TABLE [ImageLightboxes] DROP CONSTRAINT [FK_ImageLightboxes_Lightboxes_Lightbox_Id]
DROP INDEX [IX_Gallery_Id] ON [GalleryImages]
DROP INDEX [IX_Image_Id] ON [GalleryImages]
DROP INDEX [IX_User_Id] ON [UserLightboxes]
DROP INDEX [IX_Lightbox_Id] ON [UserLightboxes]
DROP INDEX [IX_Image_Id] ON [ImageLightboxes]
DROP INDEX [IX_Lightbox_Id] ON [ImageLightboxes]
CREATE TABLE [ImageGalleries] (
   [Image_Id] [int] NOT NULL,
   [Gallery_Id] [int] NOT NULL,
   CONSTRAINT [PK_ImageGalleries] PRIMARY KEY ([Image_Id], [Gallery_Id])
)
CREATE TABLE [LightboxImages] (
   [Lightbox_Id] [int] NOT NULL,
   [Image_Id] [int] NOT NULL,
   CONSTRAINT [PK_LightboxImages] PRIMARY KEY ([Lightbox_Id], [Image_Id])
)
CREATE TABLE [LightboxUsers] (
   [Lightbox_Id] [int] NOT NULL,
   [User_Id] [int] NOT NULL,
   CONSTRAINT [PK_LightboxUsers] PRIMARY KEY ([Lightbox_Id], [User_Id])
)
CREATE INDEX [IX_Image_Id] ON [ImageGalleries]([Image_Id])
CREATE INDEX [IX_Gallery_Id] ON [ImageGalleries]([Gallery_Id])
CREATE INDEX [IX_Lightbox_Id] ON [LightboxImages]([Lightbox_Id])
CREATE INDEX [IX_Image_Id] ON [LightboxImages]([Image_Id])
CREATE INDEX [IX_Lightbox_Id] ON [LightboxUsers]([Lightbox_Id])
CREATE INDEX [IX_User_Id] ON [LightboxUsers]([User_Id])
DROP TABLE [GalleryImages]
DROP TABLE [UserLightboxes]
DROP TABLE [ImageLightboxes]
ALTER TABLE [ImageGalleries] ADD CONSTRAINT [FK_ImageGalleries_Images_Image_Id] FOREIGN KEY ([Image_Id]) REFERENCES [Images] ([Id]) ON DELETE CASCADE
ALTER TABLE [ImageGalleries] ADD CONSTRAINT [FK_ImageGalleries_Galleries_Gallery_Id] FOREIGN KEY ([Gallery_Id]) REFERENCES [Galleries] ([Id]) ON DELETE CASCADE
ALTER TABLE [LightboxImages] ADD CONSTRAINT [FK_LightboxImages_Lightboxes_Lightbox_Id] FOREIGN KEY ([Lightbox_Id]) REFERENCES [Lightboxes] ([Id]) ON DELETE CASCADE
ALTER TABLE [LightboxImages] ADD CONSTRAINT [FK_LightboxImages_Images_Image_Id] FOREIGN KEY ([Image_Id]) REFERENCES [Images] ([Id]) ON DELETE CASCADE
ALTER TABLE [LightboxUsers] ADD CONSTRAINT [FK_LightboxUsers_Lightboxes_Lightbox_Id] FOREIGN KEY ([Lightbox_Id]) REFERENCES [Lightboxes] ([Id]) ON DELETE CASCADE
ALTER TABLE [LightboxUsers] ADD CONSTRAINT [FK_LightboxUsers_Users_User_Id] FOREIGN KEY ([User_Id]) REFERENCES [Users] ([Id]) ON DELETE CASCADE
CREATE TABLE [__MigrationHistory] (
   [MigrationId] [nvarchar](255) NOT NULL,
   [CreatedOn] [datetime] NOT NULL,
   [Model] [varbinary](max) NOT NULL,
   [ProductVersion] [nvarchar](32) NOT NULL,
   CONSTRAINT [PK___MigrationHistory] PRIMARY KEY ([MigrationId])
)
BEGIN TRY
   EXEC sp_MS_marksystemobject '__MigrationHistory'
END TRY
BEGIN CATCH
END CATCH
INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) VALUES ('201203030113082_AutomaticMigration', '2012-03-03T01:13:08.986Z', 0x[removedToShortenPost], '4.3.1')

जैसा कि देखा जा सकता है, DbMigrator फेंकने का कारण यह है कि यह 3 टेबल का नाम बदलने का प्रयास कर रहा है जिसका उपयोग कई टेबलों के नामों को बदलने के लिए किया जाता है, जैसे वे पुल के नामों को GalleryImages , उदाहरण के लिए ImageGalleries GalleryImages को ImageGalleries या UserLightboxes LightboxUsers को LightboxUsers UserLightboxes में।

एक कामकाजी

यह ईएफ 4.3 में एक बग की तरह दिखता है जहां "एसोसिएशन" टेबल का नामकरण अनिश्चित क्रम का प्रतीत होता है। यह देखते हुए कि इस तरह के टेबलों के नामों के क्रम को अनिर्धारित / अनिश्चित माना जाता है, हमने अलग-अलग मशीनों से निर्माण के दौरान लगातार नामकरण का उपयोग करने के लिए ईएफ को मजबूर करने के लिए धाराप्रवाह एपीआई का उपयोग करके एक अलग कोण से इसका संपर्क किया:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder
            .Entity<Gallery>()
            .HasMany(p => p.Images)
            .WithMany(p => p.Galleries)
            .Map(c =>
            {
                c.MapLeftKey("Gallery_Id");
                c.MapRightKey("Image_Id");
                c.ToTable("GalleryImages");
            });
        modelBuilder
            .Entity<User>()
            .HasMany(p => p.Lightboxes)
            .WithMany(p => p.Users)
            .Map(c =>
            {
                c.MapLeftKey("User_Id");
                c.MapRightKey("Lightbox_Id");
                c.ToTable("UserLightboxes");
            });
        modelBuilder
            .Entity<Image>()
            .HasMany(p => p.Lightboxes)
            .WithMany(p => p.Images)
            .Map(c =>
            {
                c.MapLeftKey("Image_Id");
                c.MapRightKey("Lightbox_Id");
                c.ToTable("ImageLightboxes");
            });
    }

इस जगह के साथ, त्रुटि अब चला जाता है।


मुझे एक ही त्रुटि मिलती है इसलिए मैंने एक स्क्रिप्ट उत्पन्न की और क्वेरी विश्लेषक में इसे चलाया। यह एक महत्वपूर्ण लंबाई समस्या साबित होता है:

चेतावनी! अधिकतम कुंजी लंबाई 900 बाइट्स है। इंडेक्स 'पीके_डीबीओ .__ माइग्रेशन हिस्ट्री' की अधिकतम लंबाई 1534 बाइट है। बड़े मूल्यों के कुछ संयोजन के लिए, सम्मिलित / अद्यतन ऑपरेशन विफल हो जाएगा।

ऐसा लगता है कि EntityFramework टीम को इसके बारे में पता है:

http://entityframework.codeplex.com/workitem/1216

यकीन नहीं है कि इससे क्या समस्याएं पैदा होंगी .....


 public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = true;
        } 

मुझे भी इस समस्या का सामना करना पड़ा है। विचित्र रूप से, प्रश्न में तालिका में बिल्कुल कोई डेटा नहीं है, यानी यह खाली है, कुछ ऐसा है जो कोड फर्स्ट यह जांचने पर भी प्रतीत नहीं होता है कि अगर यह माइग्रेशन लागू करता है, तो डेटा हानि होगी।





dbmigrator