खोज…


माइग्रेशन सक्षम करें

इकाई ढांचे में कोड फर्स्ट माइग्रेशन को सक्षम करने के लिए, कमांड का उपयोग करें

Enable-Migrations

पैकेज मैनेजर कंसोल पर

आपको EF द्वारा प्रबंधित अपने डेटाबेस ऑब्जेक्ट्स के साथ एक मान्य DbContext कार्यान्वयन की आवश्यकता है। इस उदाहरण में डेटाबेस संदर्भ ऑब्जेक्ट्स में शामिल होगा BlogPost और Author :

internal class DatabaseContext: DbContext
{
    public DbSet<Author> Authors { get; set; }

    public DbSet<BlogPost> BlogPosts { get; set; }
}

कमांड निष्पादित करने के बाद, निम्न आउटपुट दिखाई देना चाहिए:

PM> Enable-Migrations
Checking if the context targets an existing database...
Code First Migrations enabled for project <YourProjectName>.
PM>

इसके अलावा, एक नया फ़ोल्डर Migrations एकल फ़ाइल Configuration.cs साथ दिखाई देना चाहिए। अंदर: DB प्रोजेक्ट लेआउट

अगला कदम आपकी पहली डेटाबेस माइग्रेशन स्क्रिप्ट बनाना होगा जो प्रारंभिक डेटाबेस बनाएगी (अगले उदाहरण देखें)।

अपना पहला माइग्रेशन जोड़ें

आपके द्वारा माइग्रेशन सक्षम करने के बाद (कृपया इस उदाहरण को देखें) अब आप अपना पहला माइग्रेशन बनाने में सक्षम हैं जिसमें सभी डेटाबेस टेबल, इंडेक्स और कनेक्शन का प्रारंभिक निर्माण है।

कमांड का उपयोग करके माइग्रेशन बनाया जा सकता है

Add-Migration <migration-name>

यह कमांड एक नया वर्ग बनाएगी जिसमें दो तरीके Up और Down होते हैं जिनका उपयोग माइग्रेशन को लागू करने और निकालने के लिए किया जाता है।

अब एक प्रवास प्रारंभिक बुलाया बनाने के लिए ऊपर के उदाहरण के आधार पर आदेश लागू होते हैं:

PM> Add-Migration Initial
Scaffolding migration 'Initial'.
The Designer Code for this migration file includes a snapshot of your current Code
First model. This snapshot is used to calculate the changes to your model when you
scaffold the next migration. If you make additional changes to your model that you 
want to include in this migration, then you can re-scaffold it by running 
'Add-Migration Initial' again.

एक नई फ़ाइल टाइमस्टैम्प _Initial.cs बनाई गई है (केवल महत्वपूर्ण सामान यहां दिखाया गया है):

public override void Up()
{
   CreateTable(
       "dbo.Authors",
        c => new
           {
               AuthorId = c.Int(nullable: false, identity: true),
               Name = c.String(maxLength: 128),
           })
        .PrimaryKey(t => t.AuthorId);
        
    CreateTable(
       "dbo.BlogPosts",
       c => new
           {
                Id = c.Int(nullable: false, identity: true),
                Title = c.String(nullable: false, maxLength: 128),
                Message = c.String(),
                Author_AuthorId = c.Int(),
            })
        .PrimaryKey(t => t.Id)
        .ForeignKey("dbo.Authors", t => t.Author_AuthorId)
        .Index(t => t.Author_AuthorId);
}
    
public override void Down()
{
    DropForeignKey("dbo.BlogPosts", "Author_AuthorId", "dbo.Authors");
    DropIndex("dbo.BlogPosts", new[] { "Author_AuthorId" });
    DropTable("dbo.BlogPosts");
    DropTable("dbo.Authors");
}

जैसा कि आप देख सकते हैं, मेथड Up() दो टेबल Authors और BlogPosts बनाए गए हैं और फ़ील्ड उसी के अनुसार बनाए गए हैं। इसके अलावा, दो तालिकाओं के बीच का संबंध Author_AuthorId को जोड़कर बनाया गया है। दूसरी तरफ विधि Down() माइग्रेशन गतिविधियों को उलटने की कोशिश करती है।

यदि आप अपने माइग्रेशन के साथ आश्वस्त महसूस करते हैं, तो आप कमांड का उपयोग करके डेटाबेस में माइग्रेशन लागू कर सकते हैं:

Update-Database

सभी लंबित माइग्रेशन (इस मामले में प्रारंभिक- माइग्रेशन) डेटाबेस पर लागू होते हैं और बाद में बीज विधि को लागू किया जाता है (उपयुक्त उदाहरण)

PM> update-database
Specify the '-Verbose' flag to view the SQL statements being applied to the target     
database.
Applying explicit migrations: [201609302203541_Initial].
Applying explicit migration: 201609302203541_Initial.
Running Seed method.

आप SQL एक्सप्लोरर में गतिविधियों के परिणाम देख सकते हैं: डेटाबेस अवलोकन

Add-Migration और Update-Database कमांड के लिए कई विकल्प उपलब्ध हैं जिनका उपयोग गतिविधियों को ट्विक करने के लिए किया जा सकता है। सभी विकल्पों को देखने के लिए, कृपया उपयोग करें

get-help Add-Migration

तथा

get-help Update-Database

प्रवास के दौरान सीडिंग डेटा

माइग्रेशन को सक्षम और बनाने के बाद आपके डेटाबेस में डेटा को शुरू में भरने या माइग्रेट करने की आवश्यकता हो सकती है। कई संभावनाएं हैं लेकिन सरल माइग्रेशन के लिए आप enable-migrations कॉल enable-migrations के बाद बनाई गई फ़ाइल कॉन्फ़िगरेशन में 'बीज ()' विधि का उपयोग कर सकते हैं।

Seed() फ़ंक्शन डेटाबेस संदर्भ को पुनः प्राप्त करता है क्योंकि यह केवल पैरामीटर है और आप इस फ़ंक्शन के अंदर ईएफ संचालन करने में सक्षम हैं:

protected override void Seed(Model.DatabaseContext context);

आप Seed() अंदर सभी प्रकार की गतिविधियाँ कर सकते हैं। किसी भी विफलता के मामले में पूर्ण लेन-देन (यहां तक कि लागू पैच) को वापस रोल किया जा रहा है।

एक उदाहरण फ़ंक्शन जो केवल डेटा बनाता है यदि कोई तालिका खाली है तो ऐसा लग सकता है:

protected override void Seed(Model.DatabaseContext context)
{
    if (!context.Customers.Any()) {
        Customer c = new Customer{ Id = 1, Name = "Demo" };
        context.Customers.Add(c);
        context.SaveData();
    }
}

EF डेवलपर्स द्वारा प्रदान की गई एक अच्छी सुविधा विस्तार विधि AddOrUpdate() । यह विधि प्राथमिक कुंजी के आधार पर डेटा को अपडेट करने या पहले से मौजूद नहीं होने पर डेटा डालने की अनुमति देती है (उदाहरण कॉन्फ़िगरेशन के उत्पन्न स्रोत कोड से लिया गया है):

protected override void Seed(Model.DatabaseContext context)
{
    context.People.AddOrUpdate(
      p => p.FullName,
      new Person { FullName = "Andrew Peters" },
      new Person { FullName = "Brice Lambson" },
      new Person { FullName = "Rowan Miller" }
    );
}

कृपया ध्यान रखें कि अंतिम पैच लागू होने के बाद Seed() कहा जाता है। यदि आपको पैच के दौरान प्रवास या बीज डेटा की आवश्यकता होती है, तो अन्य तरीकों का उपयोग करने की आवश्यकता होती है।

माइग्रेशन के दौरान Sql () का उपयोग करना

उदाहरण के लिए: आप किसी मौजूदा कॉलम को गैर-आवश्यक से आवश्यक में माइग्रेट करने जा रहे हैं। इस मामले में आपको पंक्तियों के लिए अपने माइग्रेशन में कुछ डिफ़ॉल्ट मान भरने की आवश्यकता हो सकती है जहाँ परिवर्तित फ़ील्ड वास्तव में NULL । मामले में डिफ़ॉल्ट मान (जैसे "0") यदि आप एक का उपयोग कर सकते सरल है default या defaultSql अपने स्तंभ परिभाषा में संपत्ति। यदि यह इतना आसान नहीं है, तो आप अपने माइग्रेशन के Up() या Down() सदस्य कार्यों में Sql() फ़ंक्शन का उपयोग कर सकते हैं।

यहाँ एक उदाहरण है। एक वर्ग लेखक जो डेटा सेट के हिस्से के रूप में एक ईमेल-पता होता है मान लिया। अब हम एक आवश्यक फ़ील्ड के रूप में ईमेल-पता तय करते हैं। मौजूदा स्तंभों को माइग्रेट करने के लिए व्यवसाय के पास फुलनाम@ [email protected] जैसे डमी ईमेल-एड्रेस बनाने का स्मार्ट विचार है, जहाँ पूरा नाम लेखकों के बिना रिक्त स्थान के पूरा नाम है। फ़ील्ड में [Required] विशेषता जोड़ने से Email निम्नलिखित माइग्रेशन का निर्माण करेगा:

public partial class AuthorsEmailRequired : DbMigration
{
    public override void Up()
    {
        AlterColumn("dbo.Authors", "Email", c => c.String(nullable: false, maxLength: 512));
    }
    
    public override void Down()
    {
        AlterColumn("dbo.Authors", "Email", c => c.String(maxLength: 512));
    }
}

डेटाबेस के अंदर कुछ NULL फ़ील्ड होने की स्थिति में यह विफल हो जाएगा:

कॉलम 'ईमेल', तालिका 'App.Model.DatabaseContext.dbo.Authors' में मान को सम्मिलित नहीं किया जा सकता; स्तंभ नल की अनुमति नहीं देता है। अद्यतन विफल।

AlterColumn कमांड से पहले निम्न को जोड़ने से मदद मिलेगी:

Sql(@"Update dbo.Authors
    set Email = REPLACE(name, ' ', '') + N'@example.com'
    where Email is null");

update-database कॉल सफल होता है और तालिका इस तरह दिखाई देती है (उदाहरण दिखाया गया डेटा):

उदाहरण लेखक डेटा

अन्य उपयोग

आप अपने डेटाबेस में सभी प्रकार के डीएमएल और डीडीएल एक्टिबिटीज के लिए Sql() फ़ंक्शन का उपयोग कर सकते हैं। इसे माइग्रेशन लेनदेन के भाग के रूप में निष्पादित किया जाता है; यदि SQL विफल हो जाता है, तो पूर्ण माइग्रेशन विफल हो जाता है और एक रोलबैक किया जाता है।

अपने कोड के भीतर "अपडेट-डेटाबेस" करना

गैर-विकास वातावरण में चलने वाले एप्लिकेशन को अक्सर डेटाबेस अपडेट की आवश्यकता होती है। अपने डेटाबेस पैच बनाने के लिए Add-Migration कमांड का उपयोग करने के बाद अन्य वातावरणों पर अपडेट चलाने की आवश्यकता है, और फिर परीक्षण वातावरण भी।

आमतौर पर जिन चुनौतियों का सामना करना पड़ता है वे हैं:

  • कोई दृश्य स्टूडियो उत्पादन वातावरण पर स्थापित है, और
  • वास्तविक जीवन में कनेक्शन / ग्राहक वातावरण से कोई संबंध नहीं है।

एक वर्कअराउंड निम्नलिखित कोड अनुक्रम है जो अपडेट किए जाने वाले अपडेट की जांच करता है, और उन्हें क्रम में निष्पादित करता है। कृपया सुनिश्चित करें कि त्रुटियों के मामले में कोई डेटा खो जाने के लिए उचित लेनदेन और अपवाद हैंडलिंग नहीं है।

void UpdateDatabase(MyDbConfiguration configuration) {
   DbMigrator dbMigrator = new DbMigrator( configuration);
   if ( dbMigrator.GetPendingMigrations().Any() )
   {
      // there are pending migrations run the migration job
      dbMigrator.Update(); 
   }
}

जहाँ MyDbConfiguration कहीं आपके स्रोतों में आपका माइग्रेशन सेटअप है:

public class MyDbConfiguration : DbMigrationsConfiguration<ApplicationDbContext>

प्रारंभिक एंटिटी फ्रेमवर्क कोड पहला कदम से कदम स्थानांतरण

  1. एक कंसोल एप्लिकेशन बनाएं।
  2. "पैकेज मैनेजर कंसोल" में Install-Package EntityFramework चलाकर EntityFramework नगेट पैकेज Install-Package EntityFramework
  3. App.config फ़ाइल में अपना कनेक्शन स्ट्रिंग जोड़ें, आपके कनेक्शन में providerName="System.Data.SqlClient" को शामिल करना महत्वपूर्ण है।
  4. अपनी इच्छानुसार एक सार्वजनिक वर्ग बनाएं, " Blog " जैसी कोई चीज़
  5. अपना कॉन्टेक्स्टक्लास बनाएँ, जो DbContext से विरासत में मिला है, " BlogContext " जैसी कोई चीज़
  6. DbSet प्रकार के संदर्भ में किसी संपत्ति को परिभाषित करें, कुछ इस तरह से:
public class Blog 
{
    public int Id { get; set; }

    public string Name { get; set; }
}
public class BlogContext: DbContext
{
    public BlogContext(): base("name=Your_Connection_Name")
    {
    }

    public virtual DbSet<Blog> Blogs{ get; set; }
}
  1. कंस्ट्रक्टर में कनेक्शन नाम को पास करना महत्वपूर्ण है (यहाँ Your_Connection_Name)
  2. पैकेज मैनेजर कंसोल में Enable-Migration कमांड चलाएं, इससे आपके प्रोजेक्ट में माइग्रेशन फ़ोल्डर बन जाएगा
  3. Add-Migration Your_Arbitrary_Migraiton_Name कमांड चलाएँ, इससे माइग्रेशन फ़ोल्डर में दो विधि अप () और डाउन () के साथ एक माइग्रेशन क्लास Add-Migration Your_Arbitrary_Migraiton_Name
  4. ब्लॉग टेबल के साथ डेटाबेस बनाने के लिए Update-Database कमांड चलाएँ


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow