डेटाबेस पहले पाड़-DbContext पर "बिल्ड विफल"


84

मैं एक डेटाबेस (EntityFramework के डेटाबेस पहले दृष्टिकोण) से कक्षाएं उत्पन्न करने की कोशिश कर रहा हूं।

सुविधा के लिए, मैं इस ट्यूटोरियल के साथ कम या ज्यादा चल रहा हूं: https://docs.efproject.net/en/latest/platforms/full-dotnet/existing-db.html

मैं उस बिंदु पर हूं जहां मैं दृश्य स्टूडियो पैकेज प्रबंधक कंसोल में कोड की इस पंक्ति के बराबर चल रहा हूं:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -Verbose

कोड की यह लाइन त्रुटि उत्पन्न कर रही है (-Verbose mode on):

Using startup project 'EFSandbox'.
Using project 'EntityFrameworkCore'
Build started...
Build failed.

मुझे कोई अन्य विकल्प नहीं दिखता है जो किसी भी सार्थक आउटपुट का उत्पादन करता है, और मुझे इस विशेष त्रुटि पर कोई प्रलेखन नहीं दिखता है। यदि यह सभी में मदद करता है, तो इस परियोजना के पास प्रोजेक्ट नहीं है। वर्तमान में, फ़ाइल। सब कुछ .csproj फ़ाइल में है, जिसे मैंने मैन्युअल रूप से संपादित नहीं किया है।


6
जब आप संपूर्ण समाधान को पुनः प्राप्त करते हैं तो क्या आपको कोई त्रुटि / चेतावनी मिलती है?
इग्नास

@ इग्नास ने ऐसा किया, और हाँ, मुझे निर्भरता की त्रुटियां मिलीं, जो कि मेरे द्वारा पुन: प्रकाशित होने से पहले मौजूद नहीं थीं, और बस उनका अस्तित्व नहीं होना चाहिए था। इससे लड़ने की कोशिश करने के बजाय, मैंने इसका समाधान निकाल लिया। हालांकि मुझे एक नई समस्या है। लगता है कि मैं एक के बाद एक नया सवाल करना चाहिए (अगर यह एक समान है) के रूप में इस एक को संपादित करने का विरोध किया।
लाइटटॉइंड और

अपने मुद्दे पर विचार करें कि आपके पास EFC टूल घोषित करने के लिए एक प्रोजेक्ट होना चाहिए। सही प्रोजेक्ट प्रकार में पुन: लिखने का प्रयास करें और यह एक जेनसन उत्पन्न कर सकता है।
वेब्जाइन

1
मेरे लिए, जो काम कर रहा था वह यह सुनिश्चित करने के लिए था कि मचान आदेश जारी करने से पहले पूरे समाधान (न केवल परियोजना) को सफलतापूर्वक बनाया जाए।
मनीष गुप्ता

मैं इस सवाल को संक्षेप में अपडेट करना चाहता था क्योंकि इस पर बहुत ध्यान दिया गया था - यह ईएफ कोर के एक बहुत पुराने निर्माण पर था जो वर्तमान में उपलब्ध है, और कई अन्य समस्याओं के बाद, जिस समाधान के साथ हम समाप्त हुए थे वह ईएफ 6 था जब तक कोर नहीं था बसने का अधिक समय। यहां तक ​​कि EF6 की समस्याओं का भी सामना करना पड़ा, लेकिन हमने इसे और मज़बूती से स्थापित किया।
LightToTheEnd

जवाबों:


158

दो सबसे महत्वपूर्ण सुझाव:

[१] - सुनिश्चित करें कि आप एक नया पाड़ कमांड चलाने से पहले अपनी परियोजना पूरी तरह से बनाते हैं ।

अन्यथा...

  • आप कोड की एक पंक्ति लिखना शुरू कर देंगे।
  • आपको महसूस होगा कि आपके मॉडल से एक आवश्यक DB कॉलम गायब है।
  • आप इसे मचान बनाने की कोशिश करेंगे।
  • बीस मिनट बाद आपको एहसास होगा कि आपकी बिल्ड (और पाड़ कमांड) विफल हो रही है क्योंकि आपके पास कोड की आधी लिखित लाइन है। ऊप्स!

[२] - स्रोत नियंत्रण में जाँच करें या एक प्रतिलिपि बनाएँ:

  • आपको आसानी से सत्यापित करने की अनुमति देता है कि क्या बदल गया है।
  • यदि आवश्यक हो तो रोलबैक की अनुमति देता है।

अशुभ होने या गलती होने पर आपको कुछ बहुत कष्टप्रद 'चिकन और अंडे' की समस्या हो सकती है।


दूसरी समस्याएं:

यदि आपके पास कई DLL हैं, तो सुनिश्चित करें कि आप गलत प्रोजेक्ट में उत्पन्न नहीं कर रहे हैं । एक 'बिल्ड फ़ेल' संदेश कई कारणों से हो सकता है, लेकिन अगर आप उस EFCore को प्रोजेक्ट में स्थापित नहीं कर रहे हैं जो आपके द्वारा मचान में है, तो सबसे कठिन होगा।

पैकेज मैनेजर कंसोल में एक Default projectड्रॉपडाउन होता है और संभवतया आपकी नई फाइलें समाप्त हो जाती हैं यदि आप एक अपेक्षित बदलाव को याद कर रहे हैं।

ड्रॉपडाउन सेट करने के लिए याद रखने से बेहतर उपाय यह है कि -Projectस्विच को अपने मचान कमांड में जोड़ा जाए ।

यह पूरी कमांड है जिसका मैं उपयोग करता हूं:

ईएफ कोर 2 के लिए

पाड़ - DbContext -Connection "Server = (स्थानीय); डेटाबेस = DefenderRRCart; एकीकृत सुरक्षा = सही; Trusted_Connection = True;" -प्रोवाइड Microsoft.EntityFrameworkCore.SqlServer -OutputDir RRStoreContext.Models -context RRStoreContext -Project RR.DataAccess -force

ईएफ कोर 3 के लिए

dotnet ef dbcontext scaffold "Server = tcp: XXXXX.database.windows.net, 1433; आरंभिक कैटलॉग = DATABASE_NAME; Persist Security Info = False; उपयोगकर्ता आईडी = USERNAME; पासवर्ड; PASSWORD; MultipleActiveResultSets = False; Encrypt = True; TrustServerCertication प्रमाणन = ; कनेक्शन टाइमआउट = 30; " Microsoft.EntityFrameworkCore.SqlServer -o DB.Models --context-dir DB.Contexts --context RRDBContext --project RR.EF.csproj: प्रवर्तन-डेटाबेस-नाम

नोट: -force फाइलों को अधिलेखित कर देगा, लेकिन उन लोगों को नहीं हटाएगा जो किसी भी अधिक मौजूद नहीं हैं। यदि आप अपने DB से तालिकाओं को हटाते हैं, तो आपको पुरानी इकाई फ़ाइलों को स्वयं हटा देना चाहिए (बस तारीख तक एक्सप्लोरर में क्रमबद्ध करें और पुराने को हटा दें)।


पूर्ण मचान संदर्भ:

ईएफ कोर 2:

https://docs.efproject.net/en/latest/misc विविध/cli/powershell.html#scaffold-dbcontext (यह

ईएफ कोर 3:

https://docs.microsoft.com/en-us/ef/core/misc विविध/cli/dotnet


यह भी सुनिश्चित करें कि Project.JSON फ़ाइलों में उनकी टिप्पणियां नहीं हैं
Simon_Weaver

और हाँ, आप एक 'क्लास लाइब्रेरी' प्रोजेक्ट में मचान बना सकते हैं यदि आप एक अलग फाइल में अपने डेटासर्कल लॉजिक को पसंद करते हैं, लेकिन प्राथमिक प्रोजेक्ट के लिए एक एस्पेक्ट कोर प्रोजेक्ट होना जरूरी है
सिमोन_विवर

युक्ति: पैकेज प्रबंधक कंसोल से चलना सुनिश्चित करें। मेरे लिए विजुअल स्टूडियो कमांड प्रॉम्प्ट से चलने का काम नहीं करता है
सिमोन_वेवर

1
यदि आप एक संस्था फ़ाइल को निकालते हैं तो आप क्या करते हैं? मचान काम नहीं करेगा क्योंकि आप इस फ़ाइल को याद कर रहे हैं, लेकिन यह मचान नहीं बनाएगा क्योंकि यह निर्माण नहीं करता है। काफी कष्टप्रद।
sofsntp

6
वार्षिक रूप से आपको संपूर्ण समाधान बनाने में सक्षम होने की आवश्यकता प्रतीत होती है। मेरे पास अन्य परियोजनाओं में त्रुटियां थीं लेकिन मचान बनाने की परियोजना ठीक थी। समाधान अन्य परियोजनाओं का चयन करना था और उन्हें "अनलोड" करना था। फिर मचान, फिर लोड करें।
सैम

11

मुझे पता है कि यह पुराना है, लेकिन मैंने आज इसका पता लगाने की कोशिश में कुछ समय बिताया, इसलिए मुझे उम्मीद है कि इससे किसी को मदद मिलेगी।

मेरे पास एक .Net कोर प्रोजेक्ट है लेकिन मैं अपनी फाइलों को एक .Net स्टैण्डर्ड क्लास लाइब्रेरी में मचान बनाना चाहता हूँ। DbContext-Scaffoldपैकेज में मैनेजर कंसोल मेरे लिए काम नहीं करता था, लेकिन dotnet ef dbcontext scaffoldएक नियमित कमांड प्रॉम्प्ट में करता था।

मुझे अपनी कक्षा के पुस्तकालय में इन पैकेजों को स्थापित करना था:

  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.Tools

मुझे अपने समाधान में स्टार्टअप परियोजना के रूप में एक .Net कोर परियोजना निर्धारित करनी थी और उस परियोजना को मेरी कक्षा की लाइब्रेरी का संदर्भ देना था । मुझे लगता है कि आखिरी भाग वह है जो मुझे याद आ रहा था जिसने मुझे इतने लंबे समय तक अपना सिर खुजलाए रखा।

अंत में, मैंने कमांड प्रॉम्प्ट से क्लास लाइब्रेरी में cd'd किया और इसे चलाया:

dotnet ef dbcontext scaffold "<connection string>" Microsoft.EntityFrameworkCore.SqlServer -o <output folder> -s <relative path to my startup project>

11

Ctrl + Shift + B दबाकर प्रोजेक्ट को मैन्युअल रूप से बनाने से मुझे उन त्रुटियों को देखने में मदद मिली जो निर्माण को विफल कर रही थीं।


याह, समाधान का संकलन करने से मुझे भी मदद मिली।
पिएरो अल्बर्टो

जैसा कि पहले ही स्वीकार किए गए उत्तर ने वर्षों पहले कहा था। "सुनिश्चित करें कि आप एक नया पाड़ कमांड चलाने से पहले अपनी परियोजना पूरी तरह से बनाता है।"
गर्ट अर्नोल्ड

5

मुझे तब भी यह समस्या थी जब मैंने यह सुनिश्चित किया कि मेरी परियोजना (जिसमें EF Core स्थापित है) को सही तरीके से बनाया गया था। यह अभी भी "बिल्ड विफल" के साथ विफल रहा। संदेश, जो -Verbsoseध्वज का उपयोग करते समय दिखाई देता है ।

मुझे अपने मामले में ऐसा करना पड़ा:

  • एक फेंक-दूर ASP.NET कोर वेब अनुप्रयोग समाधान बनाएँ
  • समाधान के लिए EF Core NuGet पैकेज जोड़ें
  • EF Core Sql सर्वर प्रदाता NuGet पैकेज जोड़ें (क्योंकि मैं SqlServer का उपयोग कर रहा हूं)
  • EF कोर उपकरण NuGet पैकेज जोड़ें
  • -Projectमेरे नव-निर्मित (और EF कोर-प्रोविजंड) प्रोजेक्ट को इंगित करने के लिए पैकेज मैनेजर कंसोल कमांड में स्विच करें । अंतिम कदम सिर्फ अच्छे उपाय के लिए था, क्योंकि मेरे फेंक-समाधान में केवल एक परियोजना थी।

ऐसा लगता है कि इस पूरी प्रक्रिया के लिए ASP.NET कोर प्रोजेक्ट (या सिर्फ .NET .NET प्रोजेक्ट जो क्लास लाइब्रेरी नहीं है) को कहीं न कहीं समाधान में रखा जाना चाहिए, संभवतः समाधान स्टार्टअप प्रोजेक्ट के रूप में भी सेट किया गया है।


2
यह संभवतः इस पृष्ठ पर अधिक उपयोगी प्रविष्टियों में से एक है। -Verbose ध्वज को सही दिशा में धकेलना चाहिए क्योंकि यह उन चीजों की भीड़ को कवर करता है जो मचान के साथ गलत हो सकती हैं।
रेगियनानी

5

सुनिश्चित करें कि आपका प्रोजेक्ट नहीं चल रहा है, किसी कारण से यह कमांड काम नहीं करता है जबकि मेरी एपीआई पृष्ठभूमि में चल रही है।


4

VS2017 पूर्वावलोकन 3, .NET कोर 2 (प्रीव्यू) का उपयोग करके मेरे पास सभी प्रकार के मुद्दे थे, लेकिन अंततः मैंने ऊपर दिए गए दृष्टिकोण को लिया और एक नया समाधान बनाया।

  1. नया .NET कोर समाधान बनाया गया
  2. संपादित प्रोजेक्ट फ़ाइल और 1.0 से 2.0 में परिवर्तित: <TargetFramework>netcoreapp2.0</TargetFramework>
  3. बंद / फिर से खोला समाधान

फिर, इकाई ढांचा जोड़ा:

  1. PackageManager कंसोल में:
    • Microsoft.EntityFrameworkCore.SqlServer -Version 2.0.0-प्रीव्यू-फाइनल को स्थापित करें
    • Microsoft.EntityFrameworkCore.Tools -Version 2.0.0-प्रीव्यू-फाइनल को स्थापित करें
    • Microsoft.EntityFrameworkCore.Design -Version 2.0.0-प्रीव्यू-फाइनल को स्थापित करें
  2. संपादित परियोजना फ़ाइल, और गयी: <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.Dotnet" Version="2.0.0-preview2-final" />

फिर;

  1. पॉवरशेल कमांड प्रॉम्प्ट खोला और निर्देशिका को स्कैफोल्ड प्रोजेक्ट फ़ोल्डर में बदल दिया
  2. Ran: dotnet ef dbcontext scaffold "Server = DESKTOP-MB70B7U; डेटाबेस = डेटाबेस = TrustForme; Trusted_Connection = True" Microsoft।
    • जहाँ आप अपने कनेक्शन स्ट्रिंग में डाल दिया!
    • मॉडल मेरी निर्देशिका का नाम है जहां मैंने अपनी सभी कक्षाएं लगाई हैं

4

पूर्ण समाधान बनाएँ और देखें कि यह कहाँ विफल रहता है। मेरे पास एक फ़ोल्डर में कुछ नूगेट परियोजनाएं छिपी हुई थीं जो निर्माण नहीं हुई थीं। केवल समाधान के पुनर्निर्माण के दौरान मुझे पता चला कि समस्या क्या थी। सब कुछ बनाने की जरूरत है या फिर पाड़ फेल होगी।


3

मेरे लिए मुद्दा यह था कि मैं इसे समाधान के अंदर एक नई खाली कंसोल परियोजना में स्थापित करने की कोशिश कर रहा था, जिसमें कोई फाइल नहीं थी, इसलिए मचान ने इस परियोजना को स्टार्टअप परियोजना के रूप में उपयोग करने की कोशिश की और नहीं मिल सका Main। मैंने खाली मुख्य के साथ एक नई फ़ाइल जोड़कर इसे ठीक किया


3

यदि आप समाधान में कई परियोजनाओं का उपयोग करते हैं, तो पैकेज प्रबंधक में डिफ़ॉल्ट परियोजना की जांच करें।


3

उपर्युक्त के लिए धन्यवाद, परियोजना के समाधान के पुनर्निर्माण ने इसे हल किया। मेरे लिए व्यक्तिगत रूप से कुछ महत्वपूर्ण चेतावनी थीं:

  1. दौड़ना dotnet buildपर्याप्त नहीं था (मैंने मान लिया था कि यह था)!
  2. दृश्य स्टूडियो मेनू में, बिल्ड> बिल्ड समाधान (Ctrl + Shift + B)
    • मेरा मानना ​​है कि मैं केवल dotnet buildएक चाइल्ड प्रोजेक्ट के अंदर कमांड चलाने की कोशिश कर रहा था (myProject.data)
    • मूल परियोजना (myProject) समाधान का पुनर्निर्माण महत्वपूर्ण था

मुझे आशा है कि किसी और की मदद करता है जो समान रूप से भ्रमित था!


3

मैंने इसे प्रॉजेक्ट्स पर राइट क्लिक से हल किया और "अनलोड प्रोजेक्ट" को केवल ईएफ प्रोजेक्ट और कमांड चलाने दें


2

यदि इकाई-रूपरेखा वापस आती है build failed, तो संभवतः आपकी किसी भी परियोजना में किसी प्रकार की त्रुटि है।

यहां तक ​​कि अगर आप जिस प्रोजेक्ट पर कमांड चला रहे हैं, वह साफ और त्रुटि मुक्त है, तो उस समाधान की अन्य परियोजनाएं build failedप्रतिक्रिया का कारण बन सकती हैं ।

उपाय

  • संपूर्ण समाधान का पुनर्निर्माण करें। संभवतः आपको समाधान-पुनर्निर्माण प्रक्रिया में वह त्रुटि मिलेगी।
  • सुनिश्चित करें कि जिस प्रोजेक्ट पर आप कमांड चलाना चाहते हैं, वह Default projectड्रॉप-डाउन के अंदर चुना गया हैPackage Manager Console
  • कमांड को फिर से चलाएँ।

1

मेरे लिए, मेरा प्रोजेक्ट विजुअल स्टूडियो में बनाया गया था, लेकिन मुझे स्कैफोल्ड-डीबीसीकोटेक्स्ट चलाते समय "Microsoft.AspNetCore.App" के लिए एक संस्करण निर्दिष्ट करना पड़ा।

इसलिए इसके बजाय:

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <RuntimeFrameworkVersion>2.1.6</RuntimeFrameworkVersion>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App"/>
</ItemGroup>

मुझे करना पड़ा:

<PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" Version="2.1.6" />
</ItemGroup>

1

सुनिश्चित करें कि आपका निर्माण ठीक काम करता है।
पैकेज कंसोल से पाड़ कमांड चलाएँ, आपकी कमांड को काम करना चाहिए:

Scaffold-DbContext 'Data Source=TEST-XY010;Initial Catalog=TESTDB;Trusted_Connection=True' Microsoft.EntityFrameworkCore.SqlServer -Context HOPWAContext -OutputDir TESTModel -Force

1

मैंने इसे अपने सर्वर को रोककर और फिर से इसे चलाकर हल किया।


0

इसने आज मेरे लिए काम करना बंद कर दिया। इसलिए मैंने कमांड लाइन से डॉटनेट मचान कमांड चलाने की कोशिश की और यह पहली बार काम किया। मुझसे मत पूछो !!


इससे पहले कि मैं - theverbose ध्वज की खोज करता, जो स्टैकट्रेस वितरित करता था जिससे मुझे समस्या की पहचान करने की अनुमति मिली। शायद इस झंडे के बावजूद त्रुटि उत्पन्न होने पर मदद मिलेगी।
रेगियननी

-1

सुनिश्चित करें कि आपके पास सभी पैकेज हैं और समाधान बनाने के लिए ctrl + shift + b दबाएं। यह मेरे काम आता है।


जैसा कि पहले ही स्वीकार किए गए उत्तर ने वर्षों पहले कहा था। "सुनिश्चित करें कि आप एक नया पाड़ कमांड चलाने से पहले अपनी परियोजना पूरी तरह से बनाता है।"
गर्ट अर्नोल्ड

-1
  1. सुनिश्चित करें कि आपका प्रोजेक्ट नहीं चल रहा है
  2. सुनिश्चित करें कि आपका प्रोजेक्ट संकलित है

मेरे लिए वह काम कर गया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.