59

मेरे पास एक प्रोजेक्ट है जो मैं अपने update-database को चलाने के लिए चाहता हूं लेकिन मेरे पास एक अलग प्रोजेक्ट में मेरे मॉडल और संदर्भ हैं।पृथक असेंबली में संदर्भ के साथ माइग्रेशन सक्षम करें?

यदि मैं enable-migrations चलाता हूं तो मुझे यह त्रुटि मिलती है: असेंबली 'मायप्रोजेक्ट' में कोई संदर्भ प्रकार नहीं मिला था।

यह संभवतः है क्योंकि मेरा संदर्भ MyProject.MVC में है।

यदि मैं MyProject.MVC के विरुद्ध enable-migrations चलाता हूं तो मुझे एक ऐप कॉन्फ़िगरेशन फ़ाइल जोड़नी होगी। मैं ऐसा नहीं करना चाहता क्योंकि मैं कई परियोजनाओं में कोड का उपयोग करना चाहता हूं।

तो क्या मैं माइप्रोजेक्ट के खिलाफ enable-migrations चला सकता हूं और किसी भी तरह इसे संदर्भ के लिए MyProject.MVC में देखने के लिए कह सकता हूं?

+0

अपराह्न> सक्षम-माइग्रेशन -प्रोजेक्टनाम आपका प्रोजेक्ट –

उत्तर

90

यह केवल ईएफ 6 में काम करेगा, लेकिन release था जो पैरामीटर -enable-migrations कमांड में जोड़ा गया था। इस आदेश का उपयोग कर आप निम्नलिखित कर सकता है:

enable-migrations -ContextProjectName MyProject.MVC -StartUpProjectName MyProject.MVC 
-ContextTypeName MyProject.MVC.MyContextFolder.MyContextName -ProjectName MyProject 

यह MyProject.MVC में संदर्भ का उपयोग कर अपने MyProject परियोजना के लिए माइग्रेशन जोड़ देगा। आप मैं एक ही समस्या थी, तो सुनिश्चित करें कि माइग्रेशन के साथ इस परियोजना के लिए अपने संदर्भ के साथ इस परियोजना के लिए एक संदर्भ है बनाने की जरूरत है अर्थात MyProject संदर्भ MyProject.MVC

+6

यह करने का यह सही तरीका है, मुझे आश्चर्य है @ जोन ने इसे उत्तर के रूप में स्वीकार नहीं किया है। – JARRRRG

+0

यह मेरे लिए काम किया। धन्यवाद @SOfanatic – Alaor

+0

यदि 'MyProject' का' MyProject.MVC' का संदर्भ है, तो क्या यह परिपत्र निर्भरता नहीं बनाएगा? – Arithmomaniac

0

, और मैं EntityFramework 4.3.1 का उपयोग कर रहा हूँ। ऐसा लगता है कि ईएफ 6 इस मुद्दे को हल करता है (@SOfanatic द्वारा उत्तर के अनुसार) लेकिन मैं कुछ तोड़ने वाले बदलावों के कारण ईएफ 6 में अपग्रेड नहीं करना चाहता था (उदाहरण के लिए डेटा एनाटेशन में)।

तो, यह हल मैं क्या किया है (और क्या मैं इस प्रक्रिया में सीखा):

  1. एक नया समाधान (खाली परियोजना) बनाएँ और परियोजना जहां मॉडल आप सक्षम करना चाहते है जोड़ने माइग्रेशन (आपके मामले में MyProject.MVC)। इससे पहले कि आप मौजूदा प्रोजेक्ट को जोड़ सकें, आपको इसके लिए आवश्यक NuGet पैकेज इंस्टॉल करने की आवश्यकता हो सकती है।

  2. कनेक्शन स्ट्रिंग के साथ एक कॉन्फ़िगरेशन फ़ाइल जोड़ें (चिंता न करें, यह केवल माइग्रेशन इंजन को चालित करने के लिए है)। मॉडल प्रोजेक्ट आउटपुट फ़ोल्डर में अपने मौजूदा डेटाबेस की प्रतिलिपि बनाएँ (आपके मामले में एमवीसी \ bin \ Debug होना चाहिए)। कि डेटाबेस के लिए कॉन्फ़िग फ़ाइल अंक में यकीन है कि कनेक्शन स्ट्रिंग बनाओ:

    <connectionStrings> 
        <add name="MyDB" providerName="System.Data.SqlServerCe.4.0" connectionString="DataSource=|DataDirectory|\MyDB.sdf"/> 
        </connectionStrings> 
    
  3. के बाद से आप एक नया समाधान में हैं, एक स्टार्टअप परियोजना के रूप में अपने मॉडल परियोजना सेट (आप डिफ़ॉल्ट परियोजना को हटा सकते हैं)।

  4. पैकेज प्रबंधक कंसोल में सक्षम-माइग्रेशन कमांड चलाएं। इसे दो फ़ाइलों के साथ माइग्रेशन फ़ोल्डर बनाना चाहिए: एक config.cs और एक टाइमस्टैम्पड InitialCreate.cs फ़ाइल। InitialCreate होना अच्छा लगता है, यही कारण है कि आप मॉडल प्रोजेक्ट के आउटपुट फ़ोल्डर में अपना मौजूदा डेटाबेस डालते हैं (लेकिन यह वैकल्पिक है)।

  5. अपने मूल समाधान को दोबारा लोड करें ताकि ये परिवर्तन अपडेट हो जाएं।

मैं (जहाँ तक मैं समझता हूँ) क्या सीखा:

  1. माइग्रेशन इंजन कुछ कोई मान्य कनेक्शन की तरह काम करने के लिए लग रहा है कि जरूरत है। मैं कोड में (मेरी प्रोजेक्ट में) में अपनी कनेक्शन स्ट्रिंग बना रहा था और यह काम नहीं करता था। मैंने माइग्रेशन इंजन को इसे काम करने के लिए "मान्य" कनेक्शन स्ट्रिंग दिया है।
  2. अपना डेटाबेस रखें जहां माइग्रेशन इंजन इसे ढूंढ सकता है (उर्फ मॉडल प्रोजेक्ट का आउटपुट फ़ोल्डर) ताकि यह माइग्रेशन के लिए प्रारंभिक बिंदु बनाता है। यह प्रारंभिक बिंदु मूल रूप से माइग्रेशन एपीआई में लिखा गया आपकी डेटाबेस स्कीमा है।
  3. माइग्रेशन स्थान पर सेट होने के बाद आप सबकुछ अपने पिछले राज्य में पुनर्स्थापित कर सकते हैं, और यह ठीक काम करता है।
  4. हर बार जब आप मैन्युअल रूप से माइग्रेशन जोड़ना चाहते हैं, तो आपको पहली बार माइग्रेशन इंजन को फिर से "चाल" करना होगा। मैंने स्वचालित माइग्रेशन के साथ प्रयास नहीं किया है, मुझे लगता है कि यह दृष्टिकोण भी काम करता है।

वैसे, मैं एक SQL सर्वर सीई 4.0 डेटाबेस का उपयोग कर रहा हूं, इसलिए कनेक्शन स्ट्रिंग के बारे में कुछ चीजें मानक SQL सर्वर डीबी या LocalDB की तुलना में थोड़ा मोड़ है। इसके अलावा, सब कुछ वही है।

आशा है कि यह सहायक होगा और आपको कुछ अंतर्दृष्टि देता है। यदि आप इस माइग्रेशन के काम के तरीके के बारे में अधिक जानते हैं तो कृपया टिप्पणी करें।

11

आप केवल डेटाबेस संदर्भ वर्ग युक्त प्रोजेक्ट में "सक्षम-माइग्रेशन" चला सकते हैं।

आपका समाधान 2 परियोजनाओं में शामिल होंगे:

1) MyProject.Models 
    |- Migrations 
     |- 201401061557314_InitialCreate.cs 
     |- Configuration.cs 
    |- MyContext.cs 
    |- App.config (no connection string) 


App.config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    </configSections> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    <providers> 
     <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> 
    </providers> 
    </entityFramework> 
</configuration> 


2) MyProject.MVC 
     |- Filters 
      |- InitializeSimpleMembershipAttribute.cs 


InitializeSimpleMembershipAttribute.cs

namespace MyProject.MVC.Filters 
{ 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
    public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute 
    { 
     private static SimpleMembershipInitializer _initializer; 
     private static object _initializerLock = new object(); 
     private static bool _isInitialized; 

     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      // Ensure ASP.NET Simple Membership is initialized only once per app start 
      LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); 
     } 

     private class SimpleMembershipInitializer 
     { 
      public SimpleMembershipInitializer() 
      { 
       try 
       { 
        Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, MyProject.Model.Migrations.Configuration>()); 

        using (var context = new MyContext()) 
        { 
         context.Database.Initialize(force: true); 
         if (!context.Database.Exists()) 
         { 
          // Create the SimpleMembership database without Entity Framework migration schema 
          ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); 
         } 
        } 

        WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); 
       } 
       catch (Exception ex) 
       { 
        throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); 
       } 
      } 
     } 
    } 
} 

सेट MyProject.MVC स्टार्टअप परियोजना के रूप में

पैकेज प्रबंधक में, चुनें परियोजना: MyProject.Models

फिर से चलाने के लिए "सक्षम-माइग्रेशन" बनाने के लिए MyProject.Models

"अद्यतन-डेटाबेस" -> माइग्रेशन द्वारा अनुवर्ती "माइग्रेशन" फ़ोल्डर रों स्टार्टअप परियोजना से Web.config में कनेक्शन स्ट्रिंग का उपयोग प्रवास

2

यहाँ एक समाधान नहीं है प्रदर्शन करने के लिए होगा:

MyProject में एक वर्ग (माइग्रेशन के लिए परियोजना) जोड़ें। इस वर्ग को dbcontext (MyProject.MVC में से एक) का उत्तराधिकारी बनाएं।

फिर MyProject पर ईएफ माइग्रेशन कमांड चलाएं।

संबंधित मुद्दे