Saya mencoba menyimpan detail Karyawan, yang memiliki referensi dengan City. Tetapi setiap kali saya mencoba untuk menyimpan kontak saya, yang divalidasi saya mendapatkan pengecualian "ADO.Net Framework Entity Objek entitas tidak dapat dirujuk oleh beberapa contoh IEntityChangeTracker"
Saya telah membaca begitu banyak posting tetapi masih belum mendapatkan ide yang tepat tentang apa yang harus dilakukan ... kode klik tombol Simpan saya diberikan di bawah ini
protected void Button1_Click(object sender, EventArgs e)
{
EmployeeService es = new EmployeeService();
CityService cs = new CityService();
DateTime dt = new DateTime(2008, 12, 12);
Payroll.Entities.Employee e1 = new Payroll.Entities.Employee();
Payroll.Entities.City city1 = cs.SelectCity(Convert.ToInt64(cmbCity.SelectedItem.Value));
e1.Name = "Archana";
e1.Title = "aaaa";
e1.BirthDate = dt;
e1.Gender = "F";
e1.HireDate = dt;
e1.MaritalStatus = "M";
e1.City = city1;
es.AddEmpoyee(e1,city1);
}
dan Kode Layanan Karyawan
public string AddEmpoyee(Payroll.Entities.Employee e1, Payroll.Entities.City c1)
{
Payroll_DAO1 payrollDAO = new Payroll_DAO1();
payrollDAO.AddToEmployee(e1); //Here I am getting Error..
payrollDAO.SaveChanges();
return "SUCCESS";
}
sumber
Form
(apa pun, itu hanya mewakili satu unit kerja) perThread
(karenaDbContext
tidak dijamin aman untuk threads).Langkah-langkah mereproduksi dapat disederhanakan menjadi ini:
Kode tanpa kesalahan:
Hanya menggunakan satu yang
EntityContext
bisa menyelesaikan ini. Lihat jawaban lain untuk solusi lain.sumber
Ini adalah utas lama, tetapi solusi lain, yang saya lebih suka, hanya memperbarui cityId dan tidak menetapkan model lubang Kota untuk Karyawan ... untuk melakukan itu Karyawan akan terlihat seperti:
Maka itu cukup menetapkan:
sumber
Atau untuk menyuntikkan dan lebih buruk lagi Singleton, Anda dapat memanggil metode Lepaskan sebelum Tambah.
EntityFramework 6:
((IObjectContextAdapter)cs).ObjectContext.Detach(city1);
EntityFramework 4:
cs.Detach(city1);
Masih ada cara lain, jika Anda tidak perlu objek DBContext pertama. Hanya bungkus dengan menggunakan kata kunci:
sumber
dbContext1.Entry(backgroundReport).State = System.Data.Entity.EntityState.Detached
'untuk melepaskan dan kemudian dapat digunakandbContext2.Entry(backgroundReport).State = System.Data.Entity.EntityState.Modified;
untuk memperbarui. Bekerja seperti mimpiSaya memiliki masalah yang sama tetapi masalah saya dengan solusi @ Slauma (walaupun hebat dalam hal tertentu) adalah merekomendasikan agar saya meneruskan konteks ke layanan yang menyiratkan bahwa konteks tersedia dari controller saya. Itu juga memaksa kopling ketat antara controller dan lapisan layanan saya.
Saya menggunakan Dependency Injection untuk menyuntikkan lapisan layanan / repositori ke dalam pengontrol dan karenanya tidak memiliki akses ke konteks dari pengontrol.
Solusi saya adalah membuat lapisan layanan / repositori menggunakan instance konteks yang sama - Singleton.
Kelas Singleton Konteks:
Referensi: http://msdn.microsoft.com/en-us/library/ff650316.aspx
dan http://csharpindepth.com/Articles/General/Singleton.aspx
Kelas Repositori:
Solusi lain memang ada seperti instantiating konteks sekali dan meneruskannya ke konstruktor lapisan layanan / repositori Anda atau yang saya baca tentang yang menerapkan pola Unit Kerja. Saya yakin masih ada lagi ...
sumber
Dalam kasus saya, saya menggunakan ASP.NET Identity Framework. Saya telah menggunakan
UserManager.FindByNameAsync
metode bawaan untuk mengambilApplicationUser
entitas. Saya kemudian mencoba merujuk entitas ini pada entitas yang baru dibuat pada entitas yang berbedaDbContext
. Ini menghasilkan pengecualian yang awalnya Anda lihat.Saya memecahkan ini dengan membuat
ApplicationUser
entitas baru dengan hanyaId
dariUserManager
metode dan referensi entitas baru.sumber
Saya memiliki masalah yang sama dan saya bisa memecahkan membuat contoh baru dari objek yang saya coba perbarui. Kemudian saya menyerahkan objek itu ke repositori saya.
sumber
Dalam kasus ini, ternyata kesalahannya sangat jelas: Entity Framework tidak dapat melacak entitas menggunakan beberapa instance
IEntityChangeTracker
atau biasanya, multiple instance dariDbContext
. Solusinya adalah: gunakan satu instance dariDbContext
; mengakses semua entitas yang diperlukan melalui repositori tunggal (tergantung pada satu instance dariDbContext
); atau mematikan pelacakan untuk semua entitas yang diakses melalui repositori selain yang melempar pengecualian khusus ini.Saat mengikuti inversi pola kontrol di .Net Core Web API, saya sering menemukan bahwa saya memiliki pengontrol dengan dependensi seperti:
dan penggunaan suka
Karena ketiga repositori bergantung pada
DbContext
instance berbeda per permintaan, saya memiliki dua opsi untuk menghindari masalah dan mempertahankan repositori terpisah: ubah injeksi DbContext untuk membuat instance baru hanya sekali per panggilan:atau, jika entitas anak digunakan dengan cara baca-saja, matikan pelacakan pada contoh itu:
sumber
Gunakan objek DBContext yang sama sepanjang transaksi.
sumber
Saya mendapatkan masalah yang sama setelah menerapkan IoC untuk sebuah proyek (ASP.Net MVC EF6.2).
Biasanya saya akan menginisialisasi konteks data dalam konstruktor controller dan menggunakan konteks yang sama untuk menginisialisasi semua repositori saya.
Namun menggunakan IoC untuk membuat repositori menyebabkan mereka semua memiliki konteks yang terpisah dan saya mulai mendapatkan kesalahan ini.
Untuk sekarang saya sudah kembali ke hanya memperbaharui repositori dengan konteks umum sementara saya memikirkan cara yang lebih baik.
sumber
Ini adalah bagaimana saya mengalami masalah ini. Pertama saya harus menyimpan yang saya
Order
butuhkan referensi keApplicationUser
meja saya :Masalahnya adalah saya menginisialisasi ApplicationDbContext baru untuk menyimpan
Order
entitas baru saya :Jadi untuk mengatasi masalah, saya menggunakan ApplicationDbContext yang sama daripada menggunakan UserManager built-in ASP.NET MVC.
Alih-alih ini:
Saya menggunakan instance ApplicationDbContext yang ada:
sumber
Sumber kesalahan:
Semoga seseorang menghemat waktu yang berharga
sumber