আমি কীভাবে একাধিক প্রসঙ্গে ডেটাবেস পৃথক করতে EF স্থানান্তর সক্ষম করব?


122

একই প্রকল্পে একাধিক ডিবি কনটেক্সটগুলির জন্য কীভাবে আমি সত্তা ফ্রেমওয়ার্ক 5 (সংস্করণ 5.0.0) স্থানান্তর সক্ষম করব, যেখানে প্রতিটি প্রসঙ্গ তার নিজস্ব ডাটাবেসের সাথে মিল রাখে? আমি যখন Enable-Migrationsপ্রধানমন্ত্রী কনসোলে চালিত হই (ভিজ্যুয়াল স্টুডিও 2012), তখন একাধিক প্রসঙ্গ থাকার কারণে একটি ত্রুটি ঘটেছিল:

PM> Enable-Migrations
More than one context type was found in the assembly 'DatabaseService'.
To enable migrations for DatabaseService.Models.Product1DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContext.
To enable migrations for DatabaseService.Models.Product2DbContext, use Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContext.

আমি যদি চালনা Enable-Migrations -ContextTypeName DatabaseService.Models.Product1DbContextকরি তবে আমাকে চালানোর অনুমতি নেই Enable-Migrations -ContextTypeName DatabaseService.Models.Product2DbContextকারণ একটি স্থানান্তর ইতিমধ্যে রয়েছে:Migrations have already been enabled in project 'DatabaseService'. To overwrite the existing migrations configuration, use the -Force parameter.


উত্তর:


126

সক্ষম-মাইগ্রেশনগুলির দ্বিতীয় কলটি ব্যর্থ হচ্ছে কারণ কনফিগারেশন। সি ফাইলটি ইতিমধ্যে বিদ্যমান। আপনি যদি সেই শ্রেণি এবং ফাইলটির নাম পরিবর্তন করেন তবে আপনার সেই দ্বিতীয় সক্ষম-অভিবাসনগুলি চালানো উচিত, যা অন্য একটি কনফিগারেশন.সি তৈরি করবে।

এরপরে আপনাকে ডাটাবেস আপডেট করার সময় কোন কনফিগারেশনটি ব্যবহার করতে চান তা নির্দিষ্ট করতে হবে।

Update-Database -ConfigurationTypeName MyRenamedConfiguration

1
"মাই রেনমেড কনফিগারেশন" কী?
রবার্ট নোক

1
"মাইআরনেমড কনফিগারেশন" হোল্ডার পাঠ্যকে উদাহরণ হিসাবে রাখে। আপনি আপনার মূল কনফিগারেশন.সি এর নাম পরিবর্তন করে কোনও কিছুতে রাখতে পারেন, (উদাহরণস্বরূপ FooBar, তারপরে আপডেট-ডাটাবেস-কনফিগারেশন টাইপনাম FooBar চালান)।
ckal

3
সংক্ষিপ্ত ফর্ম: আপডেট-ডাটাবেস-কনফ MyRenamedConfigration
পিটার কের

100

@ কাকাল যা প্রস্তাবিত তা ছাড়াও, প্রতিটি পুনর্নবীকরণ করা কনফিগারেশন.সি.কে নিজস্ব নাম স্থান দেওয়া সমালোচনা করে। আপনি যদি তা না করেন তবে EF ভুল প্রসঙ্গে মাইগ্রেশন প্রয়োগের চেষ্টা করবে।

আমার জন্য ভালভাবে কাজ করে এমন নির্দিষ্ট পদক্ষেপগুলি এখানে।

যদি মাইগ্রেশনগুলি বিশৃঙ্খলাবদ্ধ হয় এবং আপনি একটি নতুন "বেসলাইন" তৈরি করতে চান:

  1. মাইগ্রেশন ফোল্ডারে যে কোনও বিদ্যমান .cs ফাইল মুছুন
  2. এসএসএমএসে, __MigrationHistory সিস্টেম টেবিলটি মুছুন।

প্রাথমিক স্থানান্তর তৈরি করা:

  1. প্যাকেজ ম্যানেজার কনসোলে:

    Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextA -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextA
    
  2. সলিউশন এক্সপ্লোরারে: মাইগ্রেশনগুলি নামকরণ করুন ig ভিজুয়াল স্টুডিও ব্যবহার করা হলে এটি স্বয়ংক্রিয়ভাবে কনস্ট্রাক্টরের নাম পরিবর্তন করা উচিত। এটি নিশ্চিত করুন। কনফিগারেশনএ সি সম্পাদনা করুন: নাম স্থানটি নেমস্পেসঅফকন্টেক্সটেক্সে পরিবর্তন করুন ig

  3. Enable-Migrations -EnableAutomaticMigrations -ContextTypeName
    NamespaceOfContext.ContextB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB
    
  4. সলিউশন এক্সপ্লোরারে: মাইগ্রেশনগুলির নাম পরিবর্তন করুন on আবার, নিশ্চিত হয়ে নিন যে কন্সট্রাক্টরের নামও যথাযথভাবে নামকরণ করা হয়েছে। কনফিগারেশন বি সি এস সম্পাদনা করুন: নাম স্থানটি নেমস্পেসঅফকন্টেক্সটেক্সে পরিবর্তন করুন Change

  5. add-migration InitialBSchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationB -ProjectName ProjectContextIsInIfNotMainOne
    -StartupProjectName NameOfMainProject  -ConnectionStringName ContextB 
    
  6. Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    
  7. add-migration InitialSurveySchema -IgnoreChanges -ConfigurationTypeName
    ConfigurationA -ProjectName ProjectContextIsInIfNotMainOne -StartupProjectName
    NameOfMainProject  -ConnectionStringName ContextA 
    
  8. Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

প্যাকেজ ম্যানেজার কনসোলে মাইগ্রেশন স্ক্রিপ্ট তৈরি করার পদক্ষেপ:

  1. আপনার আদেশ প্রদান করুন

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

    বা -

    Add-Migration MYMIGRATION -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    

    ডিবিতে পরিবর্তনগুলি প্রয়োগ না করা পর্যন্ত এই কমান্ডটি পুনরায় চালানো ঠিক হবে।

  2. হয় কাঙ্ক্ষিত স্থানীয় ডাটাবেসের বিপরীতে স্ক্রিপ্টগুলি চালান, অথবা স্থানীয়ভাবে প্রয়োগের জন্য -স্ক্রিপ্ট ছাড়াই আপডেট-ডাটাবেস চালান:

    Update-Database -ConfigurationTypeName ConfigurationA -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextA
    

    বা -

    Update-Database -ConfigurationTypeName ConfigurationB -ProjectName
    ProjectContextIsInIfNotMainOne -StartupProjectName NameOfMainProject
    -ConnectionStringName ContextB
    

# 4 পরিবর্তন: সম্পাদনা ConfigurationA.cs -> সম্পাদনা ConfigurationB.cs
ব্রায়ান Rizo

1
@ বিরান: এটি লক্ষ্য করার জন্য ধন্যবাদ। আমি উত্তর সম্পাদনা করেছি। দ্রষ্টব্য, আপনি নিজের উত্তরও সম্পাদনা করতে পারেন। যেহেতু আপনার কাছে এখনও 2000 খ্যাতি নেই, আপনার উত্তরগুলি একটি পর্যালোচনা সারিতে পরিণত হয় তবে সেই সারিটি সাধারণত দ্রুত কাজ করা হয়, তাই সম্ভবত আপনার সম্পাদনাটি কয়েক মিনিটের মধ্যেই অনুমোদিত হয়ে গেছে।
এরিক জে

5
ধন্যবাদ! আমি যা অনুভব করছিলাম সেটাই ছিল (নেমস্পেস)।
উইলিয়াম এম। রাউলস

এটি সাহায্য করতে পারে কারণ প্রাথমিকভাবে পদক্ষেপ 2, এবং 4- এ পুনরায় নামকরণ কীভাবে করবেন তা আমার কাছে পরিষ্কার ছিল না : আপনি যখন কনফিগারেশন.সি.এস ফাইলটি কনফিগারেশন.সি.এস বা কনফিগারেশনবি.সি.-তে নামকরণ করেন তখন পুনরায় নামকরণের ফলাফলও শ্রেণিতে এবং এর কনস্ট্রাক্টরের নামও কনফিগারেশনএ বা কনফিগারেশনবিতে দেওয়া হচ্ছে। ক্লাসটির পুনরায় নামকরণে ব্যর্থতা যখন আপনি অ্যাড-মাইগ্রেশন কমান্ডটি চালাবেন তখন ত্রুটির বার্তা তৈরি করবে - "মাইগ্রেশন কনফিগারেশন টাইপ 'কনফিগারেশনএ' সমাবেশে পাওয়া যায়নি '...' - এবং হ্যাঁ, শব্দটি ঠিক খারাপ ছিল ঠিক তেমনই ভিএস ২০১৩ - এলওএল
গ্রেগ বার্থের

3
এই আমাকে সাহায্য! সমস্ত বিকল্প এবং অর্ডার সহ সম্পূর্ণ নির্দেশাবলী। আমাকে ঘন্টা বাঁচিয়েছে
এলকুল

81

আমি ঠিক একই সমস্যায় ফেটে পড়েছি এবং আমি নিম্নলিখিত সমাধানটি ব্যবহার করেছি (সমস্ত প্যাকেজ ম্যানেজার কনসোল থেকে)

PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextA" -ContextTypeName MyProject.Models.ContextA
PM> Enable-Migrations -MigrationsDirectory "Migrations\ContextB" -ContextTypeName MyProject.Models.ContextB

এটি মাইগ্রেশন ফোল্ডারে 2 টি পৃথক ফোল্ডার তৈরি করবে। প্রতিটিতে উত্পন্ন Configuration.csফাইল থাকবে। দুর্ভাগ্যক্রমে আপনাকে এখনও এই Configuration.csফাইলগুলির নাম পরিবর্তন করতে হবে অন্যথায় তাদের মধ্যে দুটি থাকার অভিযোগ থাকবে। আমি আমার ফাইল পুনরায় নামকরণ ConfigA.csএবংConfigB.cs

সম্পাদনা : (সৌজন্যে কেভিন ম্যাকফিট) কনফিগারেশন.সি.এস ফাইলগুলির নামকরণের সময়, শ্রেণীর নাম এবং কনস্ট্রাক্টর / ইডিআইটি নামকরণও মনে রাখবেন

এই কাঠামো দিয়ে আপনি সহজভাবে করতে পারেন

PM> Add-Migration -ConfigurationTypeName ConfigA
PM> Add-Migration -ConfigurationTypeName ConfigB

যা কনফিগার ফাইলের পাশের ফোল্ডারের ভিতরে স্থানান্তরের জন্য কোড ফাইল তৈরি করবে (এই ফাইলগুলি একসাথে রাখা ভাল)

PM> Update-Database -ConfigurationTypeName ConfigA
PM> Update-Database -ConfigurationTypeName ConfigB

এবং সর্বশেষে তবে কমপক্ষে নয় এই দুটি কমান্ড তাদের কর্সপন্ডিং ডেটাবেসে সঠিক স্থানান্তর প্রয়োগ করবে।

সম্পাদনা 08 ফেব্রুয়ারী, 2016: আমি EF7 সংস্করণ 7.0.0-rc1-16348 এর সাথে একটু পরীক্ষা করেছি

আমি কাজ করতে -o | - আউটপুটডির বিকল্পটি পেতে পারি না। এটা দেওয়া অব্যাহতMicrosoft.Dnx.Runtime.Common.Commandline.CommandParsingException: Unrecognized command or argument

তবে দেখে মনে হচ্ছে যে প্রথমবার কোনও মাইগ্রেশন যুক্ত হওয়ার পরে এটি মাইগ্রেশন ফোল্ডারে যুক্ত করা হয়েছে এবং পরবর্তী প্রসঙ্গে একটি পরবর্তী স্থানান্তর স্বয়ংক্রিয়ভাবে মাইগ্রেশনের সাবডোল্ডারের মধ্যে স্থাপন করা হবে।

মূল নাম ContextAকিছু নামকরণ নিয়মাবলী লঙ্ঘন করেছে বলে তাই এখন আমি ব্যবহার মনে হয় ContextAContextএবং ContextBContext। এই নামগুলি ব্যবহার করে আপনি নিম্নলিখিত কমান্ডগুলি ব্যবহার করতে পারেন: (নোট করুন যে আমার ডিএনএক্স এখনও প্যাকেজ ম্যানেজার কনসোল থেকে কাজ করে এবং মাইগ্রেশন করতে আমি একটি পৃথক সিএমডি উইন্ডো খুলতে পছন্দ করি না)

PM> dnx ef migrations add Initial -c "ContextAContext"
PM> dnx ef migrations add Initial -c "ContextBContext"

এটির Migrationsজন্য ফোল্ডারে একটি মডেল স্ন্যাপশট এবং প্রাথমিক মাইগ্রেশন তৈরি করবে ContextAContext। এটি ContextBএই ফাইলগুলির জন্য নামের একটি ফোল্ডার তৈরি করবেContextBContext

আমি ম্যানুয়ালি একটি ContextAফোল্ডার যুক্ত করেছি এবং মাইগ্রেশন ফাইলগুলি ContextAContextসেই ফোল্ডারে স্থানান্তরিত করেছি । তারপরে আমি সেই ফাইলগুলির মধ্যে নেমস্পেসটির নামকরণ করেছি (স্ন্যাপশট ফাইল, প্রাথমিক মাইগ্রেশন এবং নোট করুন যে প্রাথমিক মাইগ্রেশন ফাইলের অধীনে একটি তৃতীয় ফাইল আছে ... ডিজাইনার। সি)। আমাকে .ContextAনেমস্পেসে যুক্ত করতে হয়েছিল এবং সেখান থেকে ফ্রেমওয়ার্কটি আবার এটি স্বয়ংক্রিয়ভাবে পরিচালনা করে।

নিম্নলিখিত কমান্ডগুলি ব্যবহার করা প্রতিটি প্রসঙ্গে একটি নতুন স্থানান্তর তৈরি করবে

PM>  dnx ef migrations add Update1 -c "ContextAContext"
PM>  dnx ef migrations add Update1 -c "ContextBContext"

এবং উত্পন্ন ফাইলগুলি সঠিক ফোল্ডারে রেখে দেওয়া হয়।


5
সবচেয়ে ভাল সমাধান, সহজ এবং আমরা একটি পরিষ্কার ফোল্ডার রাখি।
ম্যালিক

2
এই আমার উত্তর প্রয়োজন ছিল। নাম স্থানটি -মাইগ্রেশনস ডিরেক্টরীয়ের মাধ্যমে যুক্ত হয়েছিল উত্তর! ধন্যবাদ.
ক্রোব

1
সুন্দর এবং পরিষ্কার সমাধান। ধন্যবাদ।
স্টিফান সেবুলাক

4
1,5 বছর পরে, আমি খুশি যে আমি একটি নতুন প্রকল্প সেটআপ করতে নিজের পোস্টটি ব্যবহার করতে পারি।
বার্ট এস

1
আপনি যখন চালনা add-migrationকরবেন তখন নোট করুন আপনাকে জিজ্ঞাসা করবে Name। আমি ইতিমধ্যে সরবরাহ করছিলাম ConfigurationTypeNameএবং এটি যখন বলেছিল তখন এটি সামান্য বিরক্ত হয়ে গেছে বলে এটি আমাকে খানিকটা ছুঁড়ে ফেলেছে Name:। তবে অবশ্যই এটি নামটি পরিবর্তনের 'মানব পাঠযোগ্য' বর্ণনা - যেমন। AddedProductsবা IncreaseLengthOfNameFields। মাইগ্রেশন ফোল্ডারে আপনি এটি শ্রেণীর নামের অংশ হিসাবে পাবেন যাতে কী তা সহজেই দেখা যায়। সুতরাং বাস্তবে Nameএকটি চেক ইন মন্তব্য মত মত।
সাইমন_ ওয়েভার

7

আপনার কাছে ইতিমধ্যে অনেকগুলি স্থানান্তর সহ "কনফিগারেশন" রয়েছে এবং এটি যেমন রাখতে চান, আপনি সর্বদা একটি নতুন "কনফিগারেশন" শ্রেণি তৈরি করতে পারেন, এটির মতো আরও একটি নাম দিতে পারেন

class MyNewContextConfiguration : DbMigrationsConfiguration<MyNewDbContext>
{
   ...
}

তাহলে শুধু কমান্ড জারি করুন

Add-Migration -ConfigurationTypeName MyNewContextConfiguration InitialMigrationName

এবং EF সমস্যা ছাড়াই মাইগ্রেশন ভাসিয়ে দেবে। অবশেষে আপনার ডাটাবেস আপডেট করুন, এখন থেকে, আপনি কোন কনফিগারেশনটি আপডেট করতে চান তা যদি আপনি তাকে না জানান তবে EF অভিযোগ করবে:

Update-Database -ConfigurationTypeName MyNewContextConfiguration 

সম্পন্ন.

আপনার সক্ষম-মাইগ্রেশনগুলির সাথে ডিল করার দরকার নেই কারণ এটি "কনফিগারেশন" ইতিমধ্যে উপস্থিত রয়েছে বলে অভিযোগ করবে এবং আপনার বিদ্যমান কনফিগারেশন শ্রেণির নাম পরিবর্তন করলে মাইগ্রেশন ইতিহাসে সমস্যা আসবে।

আপনি বিভিন্ন ডাটাবেস, বা একই একটিকে লক্ষ্যবস্তু করতে পারেন, সমস্ত কনফিগারেশন __MigrationHistory টেবিলটি সুন্দরভাবে ভাগ করবে।


4

যদি আরও ডেটাবেস উপস্থিত থাকে তবে পাওয়ারশেলের নিম্নলিখিত কোডগুলি ব্যবহার করুন

Add-Migration Starter -context EnrollmentAppContext 
  • 'স্টার্টার' হ'ল মাইগ্রেশন নাম

  • 'এনরোলমেন্ট অ্যাপকন্টেক্সট' আমার অ্যাপ্লিকেশনটির প্রসঙ্গের নাম

আপনি ভিএস তে পাওয়ারশেলটি খুলতে পারেন: Tools->NuGet Package Manager->Package Manager Console


1
এটি আমাকে সাহায্য করেছিল। ধন্যবাদ! :)
noobprogrammer

3

পাওয়ারশেলে নিম্নলিখিত ডাটাবেসগুলি আপডেট করতে ...

Update-Database -context EnrollmentAppContext

* যদি একাধিক ডাটাবেস উপস্থিত থাকে তবে কেবলমাত্র এই কোডগুলি ব্যবহার করুন, অন্যথায় প্রয়োজনীয় নয় ..


0

আপনি একাধিক প্রসঙ্গে যখন সক্ষম-মাইগ্রেশন চালান তখন ইএফ 4.7 আসলে একটি ইঙ্গিত দেয়।

এসেম্বলির 'পরিষেবা.ডোমেন' তে একাধিক প্রসঙ্গের প্রকার পাওয়া গেছে।

To enable migrations for 'Service.Domain.DatabaseContext.Context1', 
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context1.
To enable migrations for 'Service.Domain.DatabaseContext.Context2',
use Enable-Migrations -ContextTypeName Service.Domain.DatabaseContext.Context2.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.