Pertanyaan Secara Efisien Tentukan apakah EF 4 POCO Sudah ada dalam ObjectSet


Saya mencoba EF 4 dengan POCO pada proyek kecil untuk pertama kalinya. Dalam implementasi Repositori saya, saya ingin memberikan metode AddOrUpdate yang akan menambahkan POCO yang dilewatkan ke repositori jika baru, tidak melakukan apa-apa (karena POCO yang diperbarui akan disimpan saat SaveChanges dipanggil).

Pikiran pertama saya adalah melakukan ini:

public void AddOrUpdate(Poco p)
{
    if (!Ctx.Pocos.Contains<Poco>(p))
    {
        Ctx.Pocos.AddObject(p);
    }
}

Namun itu menghasilkan a NotSupportedException seperti yang didokumentasikan di bawah Mengacu Non-Scalar Variables Tidak Didukung (Pertanyaan bonus: mengapa itu tidak didukung?)

Hanya menghapus Contains bagian dan selalu memanggil hasil AddObject di InvalidStateException:

Sebuah objek dengan kunci yang sama sudah   ada di ObjectStateManager. Itu   objek yang ada di Tidak Berubah   negara. Objek hanya dapat ditambahkan ke   ObjectStateManager lagi jika ya   di negara tambahan.

Jadi jelas EF 4 tahu di suatu tempat bahwa ini adalah duplikat berdasarkan pada kunci.

Apa cara yang bersih dan efisien untuk Repositori untuk memperbarui Pocos untuk objek baru atau yang sudah ada saat AddOrUpdate dipanggil sehingga panggilan berikutnya ke SaveChanges () akan melakukan hal yang benar?

Saya memang mempertimbangkan untuk membawa bendera isNew pada objek itu sendiri, tetapi saya mencoba untuk mengambil kegigihan tanpa henti sejauh mungkin.


4
2018-06-06 19:47


asal


Jawaban:


Coba lihat Metode ObjectStateManager.TryGetObjectStateEntry, itu baik dijelaskan dalam queston stackoverflow ini.


2
2018-06-06 21:12