Entity Framework 4, POCO object dan ASP.Net MVC2. Saya memiliki hubungan banyak ke banyak, katakanlah antara BlogPost dan entitas Tag. Ini berarti bahwa di kelas BlogPost POCO yang dihasilkan T4 saya, saya memiliki:
public virtual ICollection<Tag> Tags {
// getter and setter with the magic FixupCollection
}
private ICollection<Tag> _tags;
Saya meminta BlogPost dan Tag terkait dari instance ObjectContext dan mengirimkannya ke lapisan lain (Lihat di aplikasi MVC). Kemudian saya mendapatkan kembali BlogPost yang diperbarui dengan properti yang diubah dan hubungan yang diubah. Misalnya memiliki tag "A" "B" dan "C", dan tag baru adalah "C" dan "D". Dalam contoh khusus saya, tidak ada Tag baru dan properti Tag tidak pernah berubah, jadi satu-satunya hal yang harus disimpan adalah hubungan yang diubah. Sekarang saya perlu menyimpan ini di ObjectContext lain. (Pembaruan: Sekarang saya mencoba melakukan dalam contoh konteks yang sama dan juga gagal.)
Masalahnya: Saya tidak bisa membuatnya menyelamatkan hubungan dengan benar. Saya mencoba semua yang saya temukan:
- Controller.UpdateModel dan Controller.TryUpdateModel tidak berfungsi.
- Mendapatkan BlogPost lama dari konteks lalu mengubah koleksi tidak berfungsi. (dengan metode berbeda dari poin berikutnya)
- Ini mungkin akan berhasil, tapi saya harap ini hanya solusi, bukan solusinya :(.
- Mencoba fungsi Attach / Add / ChangeObjectState untuk BlogPost dan / atau Tag di setiap kemungkinan kombinasi. Gagal.
- Ini terlihat seperti yang saya butuhkan, tetapi tidak berhasil (saya mencoba memperbaikinya, tetapi tidak bisa untuk masalah saya).
- Mencoba ChangeState / Add / Attach / ... objek hubungan konteks. Gagal.
"Tidak berfungsi" berarti dalam banyak kasus bahwa saya mengerjakan "solusi" yang diberikan hingga tidak menghasilkan kesalahan dan setidaknya menyimpan properti BlogPost. Apa yang terjadi dengan hubungan bervariasi: biasanya Tag ditambahkan lagi ke tabel Tag dengan PK baru dan BlogPost yang disimpan mereferensikannya dan bukan yang asli. Tentu saja Tag yang dikembalikan memiliki PK, dan sebelum metode simpan / perbarui saya memeriksa PK dan mereka sama dengan yang ada di database sehingga mungkin EF berpikir bahwa mereka adalah objek baru dan PK tersebut adalah temp sementara.
Masalah yang saya ketahui dan mungkin tidak memungkinkan untuk menemukan solusi sederhana otomatis: Ketika koleksi objek POCO diubah, itu seharusnya terjadi oleh properti koleksi virtual yang disebutkan di atas, karena trik FixupCollection akan memperbarui referensi terbalik di ujung lain dari hubungan banyak-ke-banyak. Namun, saat Tampilan "mengembalikan" objek BlogPost yang diperbarui, hal itu tidak terjadi. Ini berarti mungkin tidak ada solusi sederhana untuk masalah saya, tetapi itu akan membuat saya sangat sedih dan saya akan membenci kemenangan EF4-POCO-MVC :(. Itu juga berarti EF tidak dapat melakukan ini di lingkungan MVC mana pun Jenis objek EF4 digunakan :(. Saya pikir pelacakan perubahan berbasis snapshot seharusnya mengetahui bahwa BlogPost yang diubah memiliki hubungan ke Tag dengan PK yang ada.
Btw: Saya pikir masalah yang sama terjadi dengan hubungan satu-ke-banyak (google dan kolega saya bilang begitu). Saya akan mencobanya di rumah, tetapi meskipun berhasil, itu tidak membantu saya dalam enam hubungan banyak-ke-banyak di aplikasi saya :(.