मुझे लगता है कि आप काफी हद तक वहां हैं - आप MigrateDatabaseToLatestVersion
के लिए स्रोत कोड देख सकते हैं (यह खुला स्रोत है http://entityframework.codeplex.com/
) - यह बहुत ही सरल है, जो बहुत कुछ करता है उसे DbMigrator
कहते हैं - जहाँ तक मैं देख सकता था।
आपको बस इतना करना है कि दोनों को मर्ज करना है - एक या दूसरे को आधार के रूप में उपयोग करें, वहां अन्य कार्यक्षमता जोड़ें - जो मुझे लगता है कि ठीक काम करना चाहिए।
class CreateAndMigrateDatabaseInitializer<TContext, TConfiguration> : CreateDatabaseIfNotExists<TContext>, IDatabaseInitializer<TContext>
where TContext : DbContext
where TConfiguration : DbMigrationsConfiguration<TContext>, new()
{
private readonly DbMigrationsConfiguration _configuration;
public CreateAndMigrateDatabaseInitializer()
{
_configuration = new TConfiguration();
}
public CreateAndMigrateDatabaseInitializer(string connection)
{
Contract.Requires(!string.IsNullOrEmpty(connection), "connection");
_configuration = new TConfiguration
{
TargetDatabase = new DbConnectionInfo(connection)
};
}
void IDatabaseInitializer<TContext>.InitializeDatabase(TContext context)
{
Contract.Requires(context != null, "context");
var migrator = new DbMigrator(_configuration);
migrator.Update();
// move on with the 'CreateDatabaseIfNotExists' for the 'Seed'
base.InitializeDatabase(context);
}
protected override void Seed(TContext context)
{
}
}
इसे इस तरह कहते हैं...
Database.SetInitializer(new CreateAndMigrateDatabaseInitializer<GumpDatabase, YourNamespace.Migrations.Configuration>());
...असल में, इसे ओवरराइड करें (चूंकि यह सामान्य कार्यान्वयन है) जैसे आप CreateDatabaseIfNotExists
के लिए कर रहे थे (आपके पास कॉन्फ़िगरेशन के लिए बस अतिरिक्त 'परम' है) - और बस 'बीज' की आपूर्ति करें।
class GumpDatabaseInitializer : CreateAndMigrateDatabaseInitializer<GumpDatabase, YourNamespace.Migrations.Configuration>
{
protected override void Seed(GumpDatabase context)
{
context.Database.ExecuteSqlCommand("CREATE UNIQUE INDEX Name ON Stations (Name)");
}
}
...और इसे कुछ इस तरह कहते हैं
Database.SetInitializer(new GumpDatabaseInitializer());
संपादित करें: टिप्पणियों के आधार पर - DbMigrator को दो बार नहीं चलाना चाहिए। यह हमेशा जाँच करता है (थोड़ा समय व्यतीत करता है) और एक 'रिक्त' अद्यतन करता है और आगे बढ़ता है। हालांकि अगर आप इसे हटाना चाहते हैं और प्रवेश करने से पहले 'चेक' करना चाहते हैं - यह काम करना चाहिए (ऊपर समान टुकड़ा बदलें) ...
var migrator = new DbMigrator(_configuration);
if (!context.Database.CompatibleWithModel(throwIfNoMetadata: false))
if (migrator.GetPendingMigrations().Any())
migrator.Update();
(यह एक बेमानी / डबल-चेक है - अगर-एस में से एक पर्याप्त होना चाहिए। वहां एक ब्रेक लगाएं - और देखें कि वास्तव में क्या हो रहा है, इसे अंदर नहीं जाना चाहिए - एक बार डीबी माइग्रेट हो जाने पर। जैसा कि मैंने उल्लेख किया है, ठीक काम करता है जब मैं इसका परीक्षण करें।
संपादित करें:
InitializeDatabase
. के अंदर की जगह बदलें साथ...
var doseed = !context.Database.Exists();
// && new DatabaseTableChecker().AnyModelTableExists(context);
// check to see if to seed - we 'lack' the 'AnyModelTableExists' - could be copied/done otherwise if needed...
var migrator = new DbMigrator(_configuration);
// if (doseed || !context.Database.CompatibleWithModel(throwIfNoMetadata: false))
if (migrator.GetPendingMigrations().Any())
migrator.Update();
// move on with the 'CreateDatabaseIfNotExists' for the 'Seed'
base.InitializeDatabase(context);
if (doseed)
{
Seed(context);
context.SaveChanges();
}
यह लगभग (आधे रास्ते में) गैर-सीडिंग काम करता है - अगर प्रवास पहले जाता है। और पलायन पहले होना चाहिए, नहीं तो आपको समस्या हो सकती है।
आपको अभी भी इसे ठीक से करने की आवश्यकता है - यदि आपको इसकी आवश्यकता नहीं है तो यह सार है - लेकिन यदि कोई समस्या w/MySQL इत्यादि है, तो शायद कुछ और पैर यहां काम करते हैं।
नोट: यदि आपके पास डीबी है तो भी सीडिंग कॉल नहीं करता है, लेकिन यह खाली है। समस्या दो अलग-अलग प्रारंभकर्ताओं का मिश्रण है। तो आपको उस पर काम करना होगा - या तो Create... जो अंदर करता है उसे लागू करके (वह कॉल जिसे हम कॉल नहीं कर सकते) या कुछ और।