সত্তা টাইপ <টাইপ> বর্তমান প্রসঙ্গে মডেলের অংশ নয়


146

আমি সত্তা ফ্রেমওয়ার্কে উঠছি, তবে আমি কোড-ফার্স্ট পদ্ধতির কোনও সমালোচনা পয়েন্ট মিস করছি কিনা তা সম্পর্কে আমি নিশ্চিত নই।

আমি https://genericunitofworkandrepositories.codeplex.com/ থেকে কোডের উপর ভিত্তি করে জেনেরিক সংগ্রহস্থল প্যাটার্ন ব্যবহার করছি এবং আমার সত্তা তৈরি করেছি।

কিন্তু যখন আমি সত্তাটি অ্যাক্সেস বা সংশোধন করার চেষ্টা করি তখন আমি নিম্নলিখিতগুলিতে চলে যাই:

System.InuthorOperationException: সত্তা টাইপ এস্টেট বর্তমান প্রসঙ্গে মডেলের অংশ নয়।

আমি যখন আমার সংগ্রহশালা থেকে এটি অ্যাক্সেস করার চেষ্টা করছি তখন এটি ঘটে:

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

ডাটাবেস (./SQLEXPPress) ঠিক সূক্ষ্মভাবে তৈরি করা হয়েছে, তবে সত্ত্বাগুলি (সারণী) শুরুতে তৈরি করা হয়নি created

আমি ভাবছি যদি সত্তাগুলির ম্যাপিং স্পষ্ট করে দেওয়া দরকার হয়? 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");
}

যদি আপনার টেবিলগুলি প্রারম্ভকালে তৈরি না করা হয়, এ কারণেই। অনমোডেলক্রিয়াটিং পদ্ধতিতে ওভাররাইডে আপনাকে তাদের সম্পর্কে DbContext বলতে হবে।

আপনি হয় এখানে প্রতি-সত্তা ম্যাপিংগুলি কাস্টম করতে পারেন বা এগুলিকে পৃথক EntityTypeConfiguration<T>শ্রেণিতে আলাদা করতে পারেন ।


1
ধন্যবাদ, ড্যান - এটি এটি ঠিক করে দেয়। এখন টেবিল তৈরি করা হয়। আশেপাশে অন্য কোনও উপায় নেই, ইএফ নিজে নিজে এটি করতে পারে না? আমি কেবল [টুটেবল ('এস্টেটস')] বা এ জাতীয় কিছু দিয়ে সত্ত্বাটি বয়ান করতে পারি না?
janhartmann

3
আমি মনে করি এটি OnModelCreatingযদি আপনার সত্তাগুলি একই সংস্থায় থাকে তবে ওভাররাইড না করেই কাজ করতে পারে DbContext। সত্তাগুলির জন্য আমি কখনই ডেটা টীকা ব্যবহার করি নি, তাই আমি নিশ্চিতভাবে বলতে পারি না। OnModelCreatingঅন্যান্য অ্যাসেমব্লিতে সত্তা সন্ধান করতে আপনি সর্বদা আপনার সমাবেশগুলিকে স্ক্যান করতে এবং সেগুলি স্বয়ংক্রিয়ভাবে নিবন্ধভুক্ত করতে পারেন (যা ত্রিপড যা করে)।
ডানলডুইগ

আহ, অবশ্যই এটি করার ত্রিপড পদ্ধতি সম্পর্কে নোটের জন্য ধন্যবাদ, আমি এখন অনুরূপ কিছু করেছি এবং এটি ঠিক কাজ করছে বলে মনে হচ্ছে। (এছাড়াও আপনার প্রতিচ্ছবি এক্সটেনশনের জন্য ধন্যবাদ: github.com/danludwig/Layout3/blob/master/UCosmic.Domain/Api/… )। গেটটাইপ () অ্যাসেম্বলির পরিবর্তে সন্ধানের পরিবর্তে এখন কেবল রেফারেন্স অ্যাসেম্বলিগুলি সন্ধান করা দরকার। "ভের অ্যাসেম্বলি = অ্যাসেমব্লিউ.লড (" মাত্রা। ওয়েবে.ডোমাইন ");" সুন্দর নয় ;-)
জানার্তমান

অথবা হতে পারে আমার ডোমেনের পরিবর্তে আমার নতুন / ম্যাপিং / ফোল্ডারটি আমার ইমপ্ল প্রকল্পে সরিয়ে ফেলুন।
janhartmann

@ মীপ বা ডানলডউইগ। আপনি কি আমাকে ত্রিপড সম্পর্কে আরও বলতে পারেন বা আমাকে একটি লিঙ্ক ভাগ করতে পারেন।
DkAngelito

73

স্পষ্টতই, এই ত্রুটিটি খুব সাধারণ, এটির বেশ কয়েকটি কারণ থাকতে পারে। আমার ক্ষেত্রে এটি ছিল নিম্নলিখিত: সংযোগ স্ট্রিং (ওয়েবকনফিগে) এর দ্বারা উত্পাদিত .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
আমার সমস্যাটিও ছিল সংযোগের স্ট্রিংয়ে। আমি আমার ডেটা মডেলটির নাম পরিবর্তন করেছি এবং আমার টি 4 টেমপ্লেটগুলি পুনরায় সরিয়ে ফেললাম, তবে সংযোগের স্ট্রিংয়ে মেটাডেটা (.csdl, .ssdl, .msl ফাইল) আপডেট করতে ভুলে গিয়েছি। আপনার উত্তর আমাকে এটি বুঝতে সাহায্য করেছে, তাই আপনাকে ধন্যবাদ!
ভিসকোল

4
প্রমাণীকরণের জন্য পরিচয় মডেল ব্যবহার করা হলে আপনার জন্য দুটি সংযোগের স্ট্রিং দরকার: একটি, "ডিফল্ট সংযোগ" যা আপনি নাম পরিবর্তন করতে পারেন বা না করতে পারেন এবং আপনার সর্বজনীন অ্যাপ্লিকেশনবিবি কনটেক্সট (): বেস ("আইডেন্টিটিবিবি কনটেক্সট", থ্রোএফভি 1 শেকমা: মিথ্যা)} এটাই আমার ত্রুটিটিকে ট্রিগার করেছে what আপনার মত (আমি সেখানে EF স্ট্রিং ছিল)। দ্বিতীয় সংযোগের স্ট্রিং হ'ল উইজার্ড ব্যবহার করে EF যুক্ত করা এবং এটি সংযোগ স্ট্রিং পরামিতিগুলির জন্য জিজ্ঞাসা করে। আমি আশা করি এটা কারো সাহায্যে লাগবে.
জাস্টজহান

একই অবস্থা. অবিশ্বাস্যরূপে হতাশ
নিক মলিনিক্স

1
আমি থেকে আপগ্রেড EF 4.xকরার EF 6। একটি সারণী ( DatabaseFirst) যুক্ত করতে আমাকে সংযোগের স্ট্রিংটি পুনরায় তৈরি করতে হয়েছিল । আমি লক্ষ্য করিনি যে আমার app.configএবং আমার সংযুক্তিগুলি web.configআলাদা ছিল। একবার আমি এর connectionstringকাছ থেকে গ্রহণ করার পরে app.config, এটি কাজ শুরু করে।
DHFW

16

আমার জন্য বিষয়টি হ'ল আমি সত্তা কাঠামোর জন্য প্রসঙ্গে আমার ডিবি সেট এর মধ্যে সত্তা শ্রেণি অন্তর্ভুক্ত করিনি।

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

12

আপনি মডেল থেকে টেবিলটি সরিয়ে আবার এটিকে যুক্ত করার চেষ্টা করতে পারেন। সমাধান এক্সপ্লোরার থেকে .edmx ফাইলটি খোলার মাধ্যমে আপনি এটি দৃশ্যত করতে পারেন।

পদক্ষেপ:

  1. সমাধান এক্সপ্লোরার থেকে .edmx ফাইলটিতে ডাবল ক্লিক করুন
  2. আপনি যে টেবিলের মাথাটি সরাতে চান তার ডানদিকে ক্লিক করুন এবং "মডেল থেকে মুছুন" নির্বাচন করুন
  3. এখন আবার কাজের ক্ষেত্রটিতে ডান ক্লিক করুন এবং "ডেটাবেস থেকে মডেল আপডেট করুন .." নির্বাচন করুন
  4. সারণী তালিকা থেকে আবার সারণী যুক্ত করুন
  5. সমাধানটি পরিষ্কার করুন এবং তৈরি করুন

8
EF কোডে প্রথমে কোনও .edmx নেই।
টুউকা হাপানিয়েমি

আমি একটি +1 দিয়েছি, কারণ, তিনি (বা এই সমস্যাটি নিয়ে অন্য কেউ) কোডটি প্রথমে পুনরায় চিন্তা করতে এবং এর পরিবর্তে এটি করতে
চাইবেন

9

সমস্যা হতে পারে সংযোগের স্ট্রিংয়ে। আপনার সংযোগের স্ট্রিংটি এসকিএলসিলেট সরবরাহকারীর জন্য রয়েছে তা নিশ্চিত করুন, এন্টি ফ্রেমওয়ার্ক সম্পর্কিত কোনও মেটাডেটা স্টাফ নেই।


এটি সম্ভবত অনেকের কাছেই সুস্পষ্ট ছিল তবে এই সমস্যাটি আমার সমস্যা হয়ে দাঁড়িয়েছে (কোড-ফার্স্টের সাথে ডিবি-ফার্স্ট মেশানো সম্পর্কিত)। এখন আমি আমার চাকা ঘুরিয়ে থামাতে পারি, আপনাকে ধন্যবাদ!
বোনজ024

3

আমি এই ত্রুটিটি দেখেছি যখন ডাটাবেসে কোনও বিদ্যমান সারণী যথাযথভাবে কোনও কোডের প্রথম মডেলটিতে মানচিত্র না করে। বিশেষত আমার ডাটাবেস সারণিতে একটি চর (1) এবং সি # তে একটি চর ছিল। মডেলটিকে স্ট্রিংয়ে পরিবর্তন করা সমস্যার সমাধান করে।


3

আমার সমস্যাটি সংযোগ স্ট্রিংয়ের মেটাডেটা অংশ আপডেট করে সমাধান করা হয়েছে। স্পষ্টতই এটি ভুল .csdl / .ssdl / .msl রেফারেন্সটির দিকে ইশারা করছিল।


এইটা আমার সাথে ঘটেছে. আমি অন্য কোথাও থেকে ইএফ সংযোগের অনুলিপি করেছিলাম এবং মেটা ডেটাতে মডেলের নামটি আপডেট করেছিলাম না।
devC

2

আপনার সংযোগের স্ট্রিংটি পরীক্ষা করার জন্য অন্য একটি জিনিস - মডেলের নাম। আমি প্রথমে ডিবি দুটি সত্তা মডেল ব্যবহার করছিলাম। কনফিগারেশনে আমি সত্তার সংযোগটি একটির জন্য অনুলিপি করেছি, এর নাম পরিবর্তন করেছি এবং সংযোগের স্ট্রিং অংশ পরিবর্তন করেছি changed আমি যা পরিবর্তন করি নি তা ছিল মডেলের নাম, সুতরাং যখন সত্তা মডেলটি সঠিকভাবে উত্পন্ন হয়েছিল, যখন প্রসঙ্গটি শুরু হয়েছিল EF সত্তাগুলির জন্য ভুল মডেলটির সন্ধান করছিল।

আপাতদৃষ্টিতে লিখিত আছে বলে মনে হচ্ছে, তবে চার ঘন্টা আছে আমি ফিরে পাব না।


2

আমার কাছে সমস্যাটি ছিল আমি মডেল (.edmx) connection stringদ্বারা উত্পন্ন ADO.Netউত্সটি ব্যবহার করেছি । সংযোগের স্ট্রিং পরিবর্তন করা আমার সমস্যার সমাধান করেছে।


1

আপনি যদি স্থির মডেল ক্যাশে ব্যবহার করছেন যা কোনও কারণে বা অন্য কোনও কারণে পুরানো। যদি আপনার প্রসঙ্গটি কোনও ফাইল সিস্টেমে কোনও EDMX ফাইলে ক্যাশ করা হয়ে থাকে (DbConfigration.SetModelStore এর মাধ্যমে) তবে অনমোডেলক্রিয়াটিং কখনই কল হবে না কারণ ক্যাশেড সংস্করণটি ব্যবহৃত হবে। ফলস্বরূপ যদি কোনও সত্তা আপনার ক্যাশেড স্টোর থেকে নিখোঁজ হয় তবে সংযোগের স্ট্রিং সঠিক হলেও সারণীটি ডাটাবেসে উপস্থিত রয়েছে এবং সত্তাটি আপনার ডিবি কনটেক্সটে সঠিকভাবে সেট আপ করা থাকলেও আপনি উপরের ত্রুটিটি পাবেন।


1

বার্তাটি বেশ পরিষ্কার ছিল তবে আমি এটি প্রথমে পাইনি ...

আমি দুটি সত্ত্বা ফ্রেমওয়ার্ক ডিবি প্রসঙ্গে 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

আপনি যদি প্রথমে ডিবি চেষ্টা করে থাকেন তবে আপনার টেবিলে প্রাথমিক কী আছে তা নিশ্চিত হয়ে নিন


0

ভিজ্যুয়াল স্টুডিও 2019 আমার জন্য এটির কারণ বলে মনে হচ্ছে। আমি এডিএমএক্স মডেলটি আবার 2017 এ জেনারেট করে ঠিক করেছি।


0

আমি সত্তা ফ্রেমব্রোকের একই সমস্যা পেয়েছি এবং পদক্ষেপে আমি এটিকে সমাধান করেছি:

1-আপনার Model.edmx খুলুন একটি টেবিলের জায়গার 2 টি পরিবর্তন করুন (সিএস ফাইলের পরিবর্তনের জন্য) 3-সেভ করুন

আমি আপনাকে সাহায্য আশা করি


0

.Edmx ফাইলটি মুছুন এবং আবার যুক্ত করুন। বিশেষত, যদি আপনি সত্তা ফ্রেমওয়ার্ক আপগ্রেড করেন।


0

আমি একই সমস্যার মুখোমুখি হয়েছি এনটিটি ফ্রেমওয়ার্ককরের সাথে বিভিন্ন মানের মূল্য আপডেট করার চেষ্টা করছি।

এই পদ্ধতির কাজ হয়নি

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

আপডেটরেঞ্জ পদ্ধতি যুক্ত করার পরে এবং সংযুক্তি এবং এন্ট্রি সরানোর পরে সমস্ত কিছু কাজ করে

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

0

আমার জন্য এটি ঘটেছিল কারণ আমি সত্তা শ্রেণীর নামকরণ করেছি hen যখন আমি এটি ঘুরিয়েছিলাম ঠিক আছে it


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);
}

এটি একটি অ্যাসিঙ্ক পদ্ধতিতে ছিল, তবে আমি getEntryAsync এর আগে অপেক্ষা করা ভুলে গিয়েছি এবং তাই আমি এই একই ত্রুটি পেয়েছি ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.