it-swarm-id.com

Objek tidak dapat dihapus karena tidak ditemukan di ObjectStateManager

Saya mendapatkan kesalahan ini "Objek tidak dapat dihapus karena tidak ditemukan di ObjectStateManager."

Kode saya adalah:

    protected MyEntities sqlEntities;

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

Ini berarti bahwa entitas tidak dilampirkan (tidak dimuat oleh instance konteks yang sama). Coba ini:

protected MyEntities sqlEntities;

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

Hanya klarifikasi kecil pada jawaban oleh Ladislav Mrnka (yang seharusnya menjadi jawaban yang diterima).

Jika seperti saya, Anda punya kode dalam format seperti ini:

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

..kemudian ini yang ingin Anda lakukan:

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

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

Mungkin ini tampak jelas, tetapi tidak jelas bagi saya pada awalnya bahwa perlu untuk menentukan entitas untuk diadaptasi, dan bukan hanya konteks

59
Kjartan

Sekedar penjelasan tentang penjelasan Kjartans:

Saya punya:

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

Masalahnya adalah bahwa saya menggunakan metode saya sendiri (GetProject ()) untuk mendapatkan entitas (karenanya menggunakan konteks lain untuk memuat entitas):

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

Salah satu solusinya bisa dengan melampirkan entitas yang dimuat seperti yang dinyatakan Kjartan, solusi lain bisa menjadi solusi tambang, untuk memuat entitas dalam konteks yang sama:

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;
        }
    }
10
esbenr

Saya tahu pertanyaan ini sudah cukup lama tetapi tidak ada yang di atas bekerja untuk saya karena saya menghapus register dari lebih dari satu kelas/layanan dan masing-masing dari mereka adalah instantiating konteks koneksi database itu sendiri.

Apa yang saya lakukan untuk menyelesaikannya adalah mengirim konteks pertama yang dibuat ke seluruh kelas/layanan di mana akan mengakses database.

Sebagai contoh, serviceA saya akan menghapus beberapa registernya dan memanggil serviceB dan serviceC untuk melakukan hal yang sama dengan register mereka.

Saya kemudian akan menghapus register saya pada serviceA dan meneruskan sebagai parameter konteks yang dibuat pada serviceA ke serviceB dan serviceC.

2
Terkhos

Anda dapat menulis kode ini:

var x=yourquery.FirstOrDefault(); 

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

Anda harus yakin bahwa objek Anda ada dalam daftar yang ingin Anda hapus, Anda harus meletakkan kondisi berikut

if (context.entity.contains (objek Anda))

singkirkan.

jika Anda memiliki kondisi rumit untuk kesetaraan Anda harus mengganti metode yang sama di kelas entitas untuk menempatkan kondisi Anda untuk kesetaraan, .__ untuk mendapatkan cara yang benar untuk metode ekstensi "entity.contains"

Saya punya masalah ini dan menyelesaikannya. Cukup salin kode di bawah ini:

sqlEntities.Attach(entity);
sqlEntities.Remove(entity);
sqlEntities.SaveChanges();
0
vahid sabet

Pastikan model yang masuk ke Hapus (Entitas) persis sama dengan catatan basis data. 

Beberapa kali mungkin untuk melewatkan model tanpa keluar beberapa bidang seperti Id atau Tanggal. simpan itu ke dalam @ html.Hiddenfor jika Anda memposting sebagai formulir. 

Cara terbaik adalah dengan melewatkan ID dan mendapatkan entitas menggunakan metode Find (Id) dan meneruskannya ke Remove (Entity)

Semoga ini bisa membantu seseorang.

0

Jika tidak ada yang berhasil, Anda dapat mencoba solusi ini:

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

0
Ala' Alnajjar