অবজেক্টটি স্টেটম্যানেজারে খুঁজে পাওয়া যায়নি বলে বিষয়টি মুছে ফেলা যায় না


114

আমি এই ত্রুটিটি পাচ্ছি "বস্তুটি মোছা যাবে না কারণ এটি অবজেক্টস্টেটম্যানেজারে পাওয়া যায় নি।"

আমার কোডটি হ'ল:

    protected MyEntities sqlEntities;

    public virtual void Delete(TEntity entity)
    {
        System.Type t = typeof(TEntity);
        sqlEntities.DeleteObject(entity);
        sqlEntities.SaveChanges();
    }

5
দুঃখিত, কোডটিতে সমস্যা ছিল যে রেকর্ডগুলি আনতে এবং মুছতে বিভিন্ন ডেটাঅন্টেক্সট অবজেক্ট ব্যবহার করা হত।
সামি

আমি এর মতো একটি বাগ পেয়েছিলাম: var entity = new TEntity() { PK_ID = 23 }; sqlEntities.DeleteObject(entity);আমি তার পিকে সঠিকভাবে সেট করে একটি মক সত্তা তৈরির চেষ্টা করছিলাম, আশা করি যে সত্তা ফ্রেমওয়ার্ক পিকে
সি এর

উত্তর:


156

এর অর্থ হ'ল সত্তাটি সংযুক্ত নেই (এটি একই প্রসঙ্গের উদাহরণ দ্বারা লোড হয়নি)। এটা চেষ্টা কর:

protected MyEntities sqlEntities;

public virtual void Delete(TEntity entity)
{
    sqlEntities.Attach(entity);
    sqlEntities.DeleteObject(entity);
    sqlEntities.SaveChanges();
}

1
ধন্যবাদ লাডিসালভ। কোনও পিতামাতার কাছ থেকে সন্তানের ডেটা মুছতে যখন আমার দুটি প্রসঙ্গ চলতে থাকে তখন এটি আমাকে সহায়তা করেছিল - যা একটি ট্রান্সজেকশনস্কোপের বাইরে অন্য প্রসঙ্গে থেকে ডাকা হয়েছিল। সুযোগ এবং একই প্রসঙ্গে parentর্ধ্বতন কলটি সরানো হয়েছে এবং আমার সমস্যাটির সমাধান হয়েছে।
ডান রিচার্ডসন

1
@ লাডিস্লাভ: যদি আমি ব্যবহার করি .এছাড়াও, আমি অন্যরকম ত্রুটি পেয়ে যাচ্ছি: "আইটিটিটি চেঞ্জট্র্যাকার একাধিক উদাহরণ দ্বারা কোনও সত্তা অবজেক্টটি রেফারেন্স করা যায় না।" এর অর্থ কি এই যে ইতিমধ্যে মুছে ফেলা রোধ করে অন্যান্য অবজেক্টের দৃষ্টান্ত রয়েছে?
ম্যাট

2
@ ম্যাট: না এর অর্থ এই নয় যে আপনার বস্তুটি ইতিমধ্যে অন্য প্রসঙ্গে যুক্ত attached এটি একই সাথে দুটি সংযুক্ত করা যাবে না। সত্তা মুছতে আপনার মূল প্রসঙ্গটি ব্যবহার করা উচিত।
লাডিস্লাভ মৃঙ্কা

@ লাডিস্লাভ: আপনাকে ধন্যবাদ, যা আমাকে আরও তাকাতে সাহায্য করেছে - আমি এই প্রশ্নের উত্তর পেয়েছি যা এটির সমাধানের উত্তর বলে মনে হচ্ছে: সত্তা ফ্রেমওয়ার্কে কোনও বিষয় ইতিমধ্যে কোনও ডেটা প্রসঙ্গে সংযুক্ত আছে কিনা তা পরীক্ষা করা সম্ভব? । আপনি ঠিক বলেছেন, এটি আমার ক্ষেত্রে বিষয়টি মনে হচ্ছে। দ্রুত উত্তর দেওয়ার জন্য ধন্যবাদ!
ম্যাট

অনুস্মারকটির জন্য ধন্যবাদ, আমি কেবল একটি রেকর্ড আপডেট করার সময় এটি সংযুক্ত করেছিলাম, তবে যখন আমি কোনও রেকর্ড মুছছিলাম তখন তা নয়।
pinmonkeyiii

60

লাডিস্লাভ মৃঙ্কা (যা স্বীকৃত উত্তর হওয়া উচিত) এর উত্তর সম্পর্কে কেবল একটি ছোট ব্যাখ্যা ation

যদি আমার মতো হয়, আপনি এই জাতীয় বিন্যাসে কোড পেয়েছেন:

using (var context = new MyDataContext())
{
    context.MyTableEntity.Remove(EntytyToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}

..এখন আপনি যা করতে চান:

using (var context = new MyDataContext())
{
    // Note: Attatch to the entity:
    context.MyTableEntity.Attach(EntityToRemove);

    context.MyTableEntity.Remove(EntityToRemove);
    var nrOfObjectsChanged = context.SaveChanges();
}

সম্ভবত এটি সুস্পষ্ট বলে মনে হচ্ছে, তবে প্রাথমিকভাবে আমার কাছে এটি স্পষ্ট ছিল না যে কেবল প্রসঙ্গটি নয়, সংযুক্তির জন্য সত্তা নির্দিষ্ট করা প্রয়োজন ।


1
আমি এই পদ্ধতির ব্যবহার করি এবং ব্যতিক্রম গ্রহণ করি: "স্টোর আপডেট, সন্নিবেশ করানো, বা বিবৃতি মুছে ফেলা অপ্রত্যাশিত সংখ্যক সারিগুলিকে (0) প্রভাবিত করেছে ent
kat1330

11

খালি Kjartans ব্যাখ্যার উপর ভিত্তি করে:

আমার ছিল:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = GetProject(id);
            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }

সমস্যাটি হ'ল আমি সত্তাটি পেতে আমার নিজস্ব পদ্ধতি (গেটপ্রজেক্ট ()) ব্যবহার করেছি (অতএব সত্তাটি লোড করার জন্য অন্য প্রসঙ্গ ব্যবহার করছি):

public Project GetProject(int id)
    {
        using (var context = new Context())
        {
            var project = context.Projects
                .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Profession)))
                .Include(p => p.Reports.Select(q => q.Issues.Select(r => r.Room)))
                .SingleOrDefault(x => x.Id == id);
            return project;      
        }
    }

একটি সমাধান হতে পারে লোডড সত্তাকে সংযুক্ত করা যেমন কেজার্টন বলেছে, অন্যটি আমার সমাধান হতে পারে, একই প্রসঙ্গে সত্তাটি লোড করা:

public Project DeleteProject(int id)
    {
        using (var context = new Context())
        {
            var p = context.Projects.SingleOrDefault(x => x.Id == id);
            if (p == null)
                return p;

            context.Projects.Remove(p);
            context.SaveChanges();
            return p;
        }
    }

2

আমি জানি এই প্রশ্নটি বেশ পুরানো তবে উপরের কোনওটিই আমার পক্ষে কাজ করেনি যেহেতু আমি একাধিক শ্রেণি / পরিষেবা থেকে রেজিস্টারগুলি মুছছিলাম এবং তাদের প্রত্যেকে এটির নিজস্ব ডাটাবেস সংযোগ প্রসঙ্গে ইনস্ট্যান্ট করছে।

আমি এটি সমাধান করার জন্য যা করেছি তা হ'ল প্রথম তৈরি প্রসঙ্গটি বাকী ক্লাস / পরিষেবাগুলিতে প্রেরণ করা যেখানে ডেটাবেস অ্যাক্সেস করা যায়।

উদাহরণস্বরূপ, আমার serviceAএটির কিছু নিবন্ধী মুছতে এবং কল করতে serviceBএবং serviceCতাদের রেজিস্টারগুলির সাথে একই কাজ করতে যাচ্ছি।

আমি তখন আমার রেজিস্টার মুছতে হবে serviceAএবং একটি প্যারামিটার হিসাবে তে তৈরি প্রসঙ্গ পাস serviceAকরার serviceBএবং serviceC


2

আপনি এই কোডটি লিখতে পারেন:

var x=yourquery.FirstOrDefault(); 

sqlEntities.DeleteObject(x);
sqlEntities.SaveChanges();

1

উপরের কোনটি যদি কাজ না করে তবে আপনি এই সমাধানটি চেষ্টা করতে পারেন:

context.Entry(yourObject).State = System.Data.Entity.EntityState.Deleted; context.SaveChanges();


0

আপনি নিশ্চিত হওয়া উচিত যে আপনি যে তালিকাটি অপসারণের চেষ্টা করছেন তার মধ্যে আপনার বস্তুর উপস্থিতি রয়েছে, আপনার নিম্নলিখিত শর্তটি রাখা উচিত

যদি (প্রসঙ্গ।

এটা মুছুন.

সাম্যতার জন্য যদি আপনার জটিল শর্ত থাকে তবে আপনার শর্তটিকে সাম্যতার জন্য স্থাপন করার জন্য, সীমাবদ্ধতার শ্রেণিতে সমান পদ্ধতিটি ওভাররাইড করা উচিত , একটি এক্সটেনশন পদ্ধতির "ইন্টি।


0

নিশ্চিত করুন সরান (সত্তা) এ পাস করা মডেলটি ডাটাবেস রেকর্ডের মতো ঠিক।

কিছু সময় আইডি বা তারিখের মতো কিছু ক্ষেত্র দিয়ে মডেলটি পাস করা সম্ভব। এগুলিকে @ এইচটিএমএল রাখুন idden হিডেনের জন্য যদি আপনি ফর্ম হিসাবে পোস্ট করেন।

সর্বোত্তম উপায় হ'ল আইডি পাস করা এবং সন্ধান (আইডি) পদ্ধতি ব্যবহার করে সত্তা পাওয়া এবং সরিয়ে দেওয়ার (সত্তা) পাস করা

আশা করি এটি কাউকে সাহায্য করবে।


0

আমি এই সমস্যাটি পেয়েছি এবং এটি সমাধান করেছি। কেবল কোডের নীচে অনুলিপি করুন:

sqlEntities.Attach(entity);
sqlEntities.Remove(entity);
sqlEntities.SaveChanges();

0

আমার ক্ষেত্রে একটি প্রসঙ্গ ছিল, তবে আমি 'AsNoTracking' বিকল্পের সাথে সত্তা পেয়েছি

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