वर्तमान संदर्भ के लिए इकाई प्रकार <टाइप> मॉडल का हिस्सा नहीं है


146

मैं इकाई ढांचे में शामिल हो रहा हूं, लेकिन मैं अनिश्चित हूं कि क्या मैं कोड-प्रथम दृष्टिकोण में एक महत्वपूर्ण बिंदु को याद कर रहा हूं।

मैं https://genericunitofworkandrepositories.codeplex.com/ के कोड के आधार पर एक सामान्य रिपॉजिटरी पैटर्न का उपयोग कर रहा हूं और अपनी इकाइयां बनाई हैं।

लेकिन जब मैं इकाई को निम्नलिखित में चलाने या संशोधित करने का प्रयास करता हूं:

System.InvalidOperationException: इकाई प्रकार एस्टेट वर्तमान संदर्भ के लिए मॉडल का हिस्सा नहीं है।

यह तब होता है जब मैं इसे अपने भंडार से एक्सेस करने की कोशिश कर रहा हूं:

public virtual void Insert(TEntity entity)
{
    ((IObjectState)entity).ObjectState = ObjectState.Added;
    _dbSet.Attach(entity); // <-- The error occurs here
    _context.SyncObjectState(entity);
}

डेटाबेस (./SQLEXPRESS) ठीक बनाया गया है, लेकिन इकाइयाँ (टेबल) अभी स्टार्टअप पर नहीं बनाई गई हैं।

मुझे आश्चर्य है कि क्या मुझे संस्थाओं की मैपिंग को स्पष्ट करने की आवश्यकता है? क्या EF अपने आप से यह करने में सक्षम नहीं है?

मेरी इकाई है:

public class Estate : EntityBase
{
    public int EstateId { get; set; }
    public string Name { get; set; }
} 

मेरा संदर्भ इस प्रकार है:

public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
    public DimensionWebDbContext() :
        base("DimensionWebContext")
    {
        Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
        Configuration.ProxyCreationEnabled = false;
    }

    public new IDbSet<T> Set<T>() where T : class
    {
        return base.Set<T>();
    }

}

क्या इस त्रुटि के होने का कोई विशेष कारण है? मैंने किसी भी मदद के बिना माइग्रेशन सक्षम करने और स्वचालित माइग्रेशन सक्षम करने का प्रयास किया है।

जवाबों:


142

इसे अपने कस्टम DbContextवर्ग में रखें :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Estate>().ToTable("Estate");
}

यदि आपकी टेबल स्टार्टअप पर नहीं बनी हैं, तो यही कारण है। आपको OnModelCreating विधि ओवरराइड में उनके बारे में DbContext को बताने की आवश्यकता है।

आप या तो यहां प्रति-इकाई मैपिंग कस्टम कर सकते हैं, या उन्हें अलग-अलग EntityTypeConfiguration<T>कक्षाओं में अलग कर सकते हैं।


1
धन्यवाद, Dan - यह इसे ठीक करता है। अब टेबल बनाई हैं। कोई दूसरा रास्ता नहीं है, ईएफ अपने दम पर ऐसा नहीं कर सकता है? मैं बस इकाई को [ToTable ('संपदा')] या कुछ इस तरह से एनोटेट कर सकता हूं?
१३:३३ को

3
मुझे लगता है कि OnModelCreatingयदि आपकी इकाइयाँ आपके असेंबली में हैं तो आप ओवरराइड किए बिना काम कर सकते हैं DbContext। मैंने कभी भी संस्थाओं के लिए डेटा एनोटेशन का उपयोग नहीं किया है, इसलिए मैं निश्चित रूप से नहीं कह सकता। OnModelCreatingअन्य असेंबली में इकाइयाँ ढूँढने के लिए और उन्हें स्वचालित रूप से पंजीकृत करने के लिए आप हमेशा असेंबली को स्कैन कर सकते हैं (जो कि ट्राइपॉड करता है)।
danludwig

आह, बिल्कुल। यह करने के तिपाई तरीके के बारे में नोट के लिए धन्यवाद, मैंने अब कुछ ऐसा ही किया है, और यह ठीक काम करता है। (अपने प्रतिबिंब एक्सटेंशन पर भी धन्यवाद: github.com/danludwig/Layout3/blob/master/UCosmic.Domain/Api/… )। अब मुझे इसकी आवश्यकता है कि गेटटाइप () असेंबली देखने के बजाय संदर्भ असेंबली खोजें। "var असेम्बली = असेंबली। लोड (" डाइमेंशन.वेब.डोमेन ");" सुंदर नहीं है ;-)
जनार्तमान

या शायद अपने डोमेन के बजाय अपने नए / मानचित्रण / फ़ोल्डर को अपने Impl प्रोजेक्ट में स्थानांतरित करें।
जन्हार्टमैन

@ एमपी या डैनलुडविग। क्या आप कृपया मुझे ट्राइपॉड के बारे में अधिक बता सकते हैं या मुझे एक लिंक साझा कर सकते हैं।
DkAngelito 18

73

जाहिर है, यह त्रुटि बहुत सामान्य है, इसके कई कारण हो सकते हैं। मेरे मामले में, यह निम्नलिखित था: कनेक्शन स्ट्रिंग (Web.config में) .edmxअमान्य था। लगभग सब कुछ आज़माने के बाद, मैंने EF स्ट्रिंग से ADO.NET स्ट्रिंग में कनेक्शन स्ट्रिंग को बदल दिया। इससे मेरी समस्या हल हो गई।

उदाहरण के लिए, EF स्ट्रिंग कुछ इस तरह दिखती है:

<connectionStrings> 
  <add name="BlogContext"  
    connectionString="metadata=res://*/BloggingModel.csdl| 
                               res://*/BloggingModel.ssdl| 
                               res://*/BloggingModel.msl; 
                               provider=System.Data.SqlClient 
                               provider connection string= 
                               &quot;data source=(localdb)\v11.0; 
                               initial catalog=Blogging;
                               integrated security=True; 
                               multipleactiveresultsets=True;&quot;" 
     providerName="System.Data.EntityClient" /> 
</connectionStrings>

और ADO.NET स्ट्रिंग इस तरह दिखता है:

<connectionStrings>
  <add name="BlogContext"  
        providerName="System.Data.SqlClient"  
        connectionString="Server=.\SQLEXPRESS;Database=Blogging;
        Integrated Security=True;"/> 
</connectionStrings>

स्रोत: http://msdn.microsoft.com/nl-nl/data/jj556606.aspx


17
मेरी समस्या कनेक्शन स्ट्रिंग में भी थी। मैंने अपने डेटा मॉडल का नाम बदला और अपने t4 टेम्प्लेट को फिर से चलाया, लेकिन कनेक्शन स्ट्रिंग में मेटाडेटा (.csdl, .ssdl, .msl फ़ाइलें) को अपडेट करना भूल गया। आपके उत्तर ने मुझे यह महसूस करने में मदद की, इसलिए धन्यवाद!
विस्कॉल

4
प्रमाणीकरण के लिए पहचान मॉडल का उपयोग करने के लिए आपको 2 कनेक्शन स्ट्रिंग्स की आवश्यकता होती है: एक, "DefaultConnection" जिसे आप नाम बदल सकते हैं या नहीं और अपने सार्वजनिक ApplicationDbContext (): बेस ("IdentityDbContext", throwIfV1Schema: false) {} में वही है जो मेरी त्रुटि को ट्रिगर करता है। तुम्हारी तरह (मैं वहाँ में EF स्ट्रिंग था)। दूसरा कनेक्शन स्ट्रिंग विज़ार्ड का उपयोग करके ईएफ को जोड़ने से बना है और यह कनेक्शन स्ट्रिंग मापदंडों के लिए पूछता है। मुझे उम्मीद है इससे किसी को सहायता मिलेगी।
जस्टजॉन

मुझे भी। अविश्वसनीय रूप से निराशाजनक
निक मोलिनक्लेव

1
मैं से अपग्रेड EF 4.xकरने के लिए EF 6। मुझे एक तार जोड़ने के लिए कनेक्शन स्ट्रिंग को पुनर्जीवित करना था ( DatabaseFirst)। मैंने यह नहीं देखा कि मेरे कनेक्शन में app.configऔर web.configअलग थे। एक बार मैं पदभार संभाल लिया है connectionstringसे app.config, यह काम करना शुरू किया।
डीएचएफडब्ल्यू

16

मेरे लिए मुद्दा यह था कि मैंने इकाई ढांचे के संदर्भ में अपने डीबी सेट के भीतर इकाई वर्ग को शामिल नहीं किया था।

public DbSet<ModelName> ModelName { get; set; }

12

आप मॉडल से तालिका को हटाने और इसे फिर से जोड़ने का प्रयास कर सकते हैं। आप समाधान एक्सप्लोरर से .edmx फ़ाइल खोलकर इसे नेत्रहीन कर सकते हैं।

कदम:

  1. समाधान एक्सप्लोरर से .edmx फ़ाइल पर डबल क्लिक करें
  2. उस तालिका शीर्ष पर राइट क्लिक करें जिसे आप हटाना चाहते हैं और "मॉडल से हटाएं" चुनें
  3. अब फिर से कार्य क्षेत्र पर राइट क्लिक करें और "डेटाबेस से अपडेट मॉडल का चयन करें .."
  4. तालिका सूची से तालिका को फिर से जोड़ें
  5. समाधान को साफ और निर्माण करें

8
पहले EF कोड में कोई .edmx नहीं है।
तुआका हापानीमी 14

मैंने एक +1 दिया, हालाँकि, क्योंकि वह (या इस मुद्दे के साथ कोई और) कोड फर्स्ट करने पर फिर से विचार करना चाहता है और इसे इस तरह से कर सकता है, इसके बजाय :)
vapcguy

9

समस्या कनेक्शन स्ट्रिंग में हो सकती है। सुनिश्चित करें कि आपका कनेक्शन स्ट्रिंग SqlClient प्रदाता के लिए है, जिसमें EntityFramework से संबंधित कोई मेटाडेटा सामान नहीं है।


यह शायद कई लोगों के लिए स्पष्ट था, लेकिन यह घाव मेरा मुद्दा रहा (कोड-प्रथम के साथ डीबी-प्रथम को मिलाकर)। अब मैं अपने पहियों को घूमना बंद कर सकता हूं, बड़ा धन्यवाद!
Bonez024

3

मैंने यह त्रुटि तब देखी है जब डेटाबेस में एक मौजूदा तालिका किसी कोड प्रथम मॉडल के लिए उचित रूप से मैप नहीं करती है। विशेष रूप से मेरे पास डेटाबेस तालिका में एक चार्ट (1) और सी # में एक चार्ट था। मॉडल को एक स्ट्रिंग में बदलने से समस्या हल हो गई।


3

कनेक्शन स्ट्रिंग के मेटाडेटा भाग को अद्यतन करके मेरी समस्या का समाधान कर दिया गया था। स्पष्ट रूप से यह गलत .csdl / .ssdl / .msl संदर्भ की ओर इशारा कर रहा था।


यह मेरे साथ भी हुआ। मैंने EF कनेक्शन को कहीं और से कॉपी किया था और मेटा डेटा में मॉडल का नाम अपडेट नहीं किया था।
devC

2

आपके कनेक्शन स्ट्रिंग के साथ जांच करने के लिए एक और चीज - मॉडल का नाम। मैं पहले दो इकाई मॉडल, डीबी का उपयोग कर रहा था। कॉन्फ़िगरेशन में मैंने एक के लिए इकाई कनेक्शन की प्रतिलिपि बनाई, इसका नाम बदला, और कनेक्शन स्ट्रिंग भाग को बदल दिया। मैंने जो परिवर्तन नहीं किया वह मॉडल का नाम था, इसलिए जब इकाई मॉडल सही ढंग से उत्पन्न हुआ, जब संदर्भ शुरू किया गया था, तो ईएफ संस्थाओं के लिए गलत मॉडल में दिख रहा था।

नीचे लिखा स्पष्ट दिखता है, लेकिन चार घंटे हैं जो मुझे वापस नहीं मिलेगा।


2

मेरे लिए मुद्दा यह था कि मैंने मॉडल (.edmx) connection stringद्वारा जनरेट किया था ADO.Net। कनेक्शन स्ट्रिंग बदलने से मेरी समस्या हल हो गई।


1

यह तब भी हो सकता है यदि आप एक स्थायी मॉडल कैश का उपयोग कर रहे हैं जो एक कारण या किसी अन्य के लिए पुराना है। यदि आपके संदर्भ को एक EDMX फ़ाइल में फ़ाइल सिस्टम (DbConfiguration.SetModelStore के माध्यम से) में कैश किया गया है, तो ऑनमोडेलक्रिटिंग को कभी भी कॉल नहीं किया जाएगा क्योंकि कैश्ड संस्करण का उपयोग किया जाएगा। परिणामस्वरूप यदि आपके कैश्ड स्टोर से कोई इकाई गायब है, तो आपको उपरोक्त त्रुटि मिल जाएगी, भले ही कनेक्शन स्ट्रिंग सही हो, तालिका डेटाबेस में मौजूद है और इकाई आपके DbContext में सही तरीके से सेट है।


1

संदेश बहुत स्पष्ट था, लेकिन मुझे यह पहले नहीं मिला ...

मैं दो एंटिटी फ्रेमवर्क DB संदर्भों के साथ sysContextऔर shardContextउसी पद्धति में काम कर रहा हूं ।

जिस इकाई को मैंने संशोधित किया था \ _ एक संदर्भ से अद्यतन किया गया था, लेकिन फिर मैंने इसे इस तरह से दूसरे संदर्भ में सहेजने की कोशिश की:

invite.uid = user.uid;

sysContext.Entry(invite).State = EntityState.Modified;

sysContext.SaveChanges(); // Got the exception here

लेकिन सही संस्करण यह होना चाहिए:

invite.uid = user.uid;

shardContext.Entry(invite).State = EntityState.Modified;

shardContext.SaveChanges();

इकाई को सही संदर्भ में पारित करने के बाद यह त्रुटि दूर हो गई।


0

स्पष्ट लगता है, लेकिन सुनिश्चित करें कि आप स्पष्ट रूप से प्रकार की अनदेखी नहीं कर रहे हैं:

modelBuilder.Ignore<MyType>();


0

इकाई का नक्शा (यहां तक ​​कि एक खाली एक) विन्यास में जोड़ा इकाई प्रकार संदर्भ का हिस्सा होने के लिए नेतृत्व करेंगे। हमारे पास अन्य संस्थाओं के साथ कोई संबंध नहीं था जो एक खाली मानचित्र के साथ तय किया गया था।


0

यदि आप पहले DB की कोशिश कर रहे हैं, तो सुनिश्चित करें कि आपकी तालिका में प्राथमिक कुंजी है


0

विजुअल स्टूडियो 2019 मेरे लिए इसका कारण बनता है। मैंने 2017 में फिर से edmx मॉडल तैयार करके इसे ठीक किया।


0

मुझे Entity Framewrok में एक ही समस्या आती है और मैंने इसे चरणों में हल किया है:

1-अपने Model.edmx को खोलें 2-टेबल की जगह बदलें (सीएस फाइल में बदलाव के लिए) 3-इसे सेव करें

मुझे आशा है कि आप मदद करेंगे


0

.Edmx फ़ाइल को हटाएँ और इसे फिर से जोड़ें। खासकर, अगर आपने एंटिटी फ्रेमवर्क को अपग्रेड किया है।


0

मैं EntityFrameworkCore के साथ एक ही मुद्दे का सामना कर रहा था मूल्यों की एक श्रृंखला को अपडेट करने की कोशिश कर रहा है।

यह दृष्टिकोण काम नहीं आया

  _dbSet.AttachRange(entity);
  _context.Entry(entity).State = EntityState.Modified;
   await _context.SaveChangesAsync().ConfigureAwait(false);

UpdateRange मेथड को जोड़ने के बाद और अटैचमेंट को हटाकर हर काम को एंट्री करें

  _dbSet.UpdateRange(entity);
  await _context.SaveChangesAsync().ConfigureAwait(false);

0

मेरे लिए यह कारण था क्योंकि मैंने संस्था का नाम बदल दिया था। जब मैंने इसे वापस लिया तो यह ठीक था।


0

बेवकूफ हो सकता है, लेकिन अगर आपको केवल कुछ टेबल पर यह त्रुटि मिली है, तो अपनी परियोजना को साफ करने और पुनर्निर्माण करने के लिए मत भूलना (बहुत समय बचा सकता है)


0

मेरे पास यह था

using (var context = new ATImporterContext(DBConnection))
{
    if (GetID(entity).Equals(0))
    {
        context.Set<T>().Add(entity);
    }
    else
    {
        int val = GetID(entity);
        var entry = GetEntryAsync(context, GetID(entity)).ConfigureAwait(false);
        context.Entry(entry).CurrentValues.SetValues(entity);

    }
    
    await context.SaveChangesAsync().ConfigureAwait(false);
}

यह एक async विधि में था, लेकिन मैं GetEntryAsync से पहले वेट लगाना भूल गया हूं, और इसलिए मुझे यह वही मिला ...

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