Saya menggunakan Entity Framework 1 dengan .net 3.5.
Saya melakukan sesuatu yang sederhana seperti ini:
var roomDetails = context.Rooms.ToList();
foreach (var room in roomDetails)
{
room.LastUpdated = DateTime.Now;
}
Saya mendapatkan kesalahan ini ketika saya mencoba melakukan:
context.SaveChanges();
Saya mendapatkan kesalahan:
Tidak dapat memperbarui EntitySet - karena ia memiliki elemen MendefinisikanQuery dan tidak ada elemen <UpdateFunction> dalam elemen <ModificationFunctionMapping> untuk mendukung operasi saat ini.
Saya melakukan banyak pembaruan pada konteksnya dan tidak memiliki masalah, itu hanya ketika saya mencoba untuk memperbarui entitas tertentu ini.
Semua pencarian saya menunjukkan hal yang sama, bahwa tidak ada kunci primer yang dinyatakan pada entitas yang saya coba perbarui. Tapi sayangnya, saya memiliki kunci primer yang dinyatakan ...
Jawaban:
Ini biasanya terjadi karena salah satu alasan berikut:
Setelah melakukannya, Anda mungkin masih perlu memperbarui dalam desainer Entity Framework (atau menghapus entitas dan kemudian menambahkannya) sebelum Anda berhenti mendapatkan kesalahan.
sumber
Cukup Tambahkan kunci utama ke tabel. Itu dia. Masalah terpecahkan.
sumber
Inilah yang terjadi pada saya. Cukup menghapus mengakibatkan kesalahan lain. Saya mengikuti langkah-langkah posting ini kecuali yang terakhir. Demi kenyamanan Anda, saya menyalin 4 langkah dari pos yang saya ikuti untuk menyelesaikan masalah sebagai berikut:
store:Schema="dbo"
menjadiSchema="dbo"
(jika tidak, kode akan menghasilkan kesalahan yang mengatakan nama tidak valid)sumber
Harap perhatikan bahwa mungkin Entitas Anda memiliki kunci utama tetapi tabel Anda di basis data tidak memiliki kunci utama .
sumber
UPDATE: Saya mendapatkan beberapa upvotes tentang ini akhir-akhir ini, jadi saya pikir saya akan membiarkan orang tahu saran saya berikan di bawah ini bukan yang terbaik. Karena saya awalnya mulai mengoceh tentang melakukan Entity Framework pada database keyless lama, saya menyadari bahwa hal terbaik yang dapat Anda lakukan DENGAN JAUH adalah melakukannya dengan membalikkan kode-terlebih dahulu. Ada beberapa artikel bagus tentang bagaimana melakukan ini. Cukup ikuti mereka, dan kemudian ketika Anda ingin menambahkan kunci untuk itu, gunakan anotasi data untuk "memalsukan" kunci tersebut.
Sebagai contoh, katakanlah saya tahu meja saya
Orders
, walaupun tidak memiliki kunci utama, dijamin hanya memiliki satu nomor pesanan per pelanggan. Karena itu adalah dua kolom pertama di atas tabel, saya akan menyiapkan kode kelas pertama agar terlihat seperti ini:Dengan melakukan ini, Anda pada dasarnya memalsukan EF agar percaya bahwa ada kunci yang dikelompokkan yang terdiri dari OrderNumber dan Pelanggan. Ini akan memungkinkan Anda untuk melakukan sisipan, pembaruan, dll pada tabel tanpa kunci Anda.
Jika Anda tidak terlalu terbiasa melakukan reverse Code First, buka dan temukan tutorial yang bagus tentang Entity Framework Code First. Kemudian cari satu di Reverse Code First (yang melakukan Code First dengan database yang ada). Kemudian kembali saja ke sini dan lihat saran kunci saya lagi. :)
Jawaban asli :
Pertama: seperti yang orang lain katakan, opsi terbaik adalah menambahkan kunci utama ke tabel. Titik. Jika Anda dapat melakukan ini, jangan baca lagi.
Tetapi jika Anda tidak bisa, atau hanya membenci diri sendiri, ada cara untuk melakukannya tanpa kunci utama.
Dalam kasus saya, saya bekerja dengan sistem legacy (awalnya file datar pada AS400 porting ke Access dan kemudian porting ke T-SQL). Jadi saya harus mencari cara. Ini solusi saya. Berikut ini bekerja untuk saya menggunakan Entity Framework 6.0 (yang terbaru di NuGet pada tulisan ini).
Klik kanan pada file .edmx Anda di Solution Explorer. Pilih "Buka Dengan ..." lalu pilih "Editor XML (Teks)". Kami akan mengedit kode yang dibuat secara otomatis di sini.
Cari garis seperti ini:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" store:Schema="dbo" store:Name="table_nane">
Hapus
store:Name="table_name"
dari ujung.Ubah
store:Schema="whatever"
keSchema="whatever"
Lihat di bawah garis itu dan temukan
<DefiningQuery>
tag. Itu akan memiliki pernyataan pilih ol besar di dalamnya. Hapus tag dan isinya.Sekarang baris Anda akan terlihat seperti ini:
<EntitySet Name="table_name" EntityType="MyModel.Store.table_name" store:Type="Tables" Schema="dbo" />
Kami memiliki sesuatu yang lain untuk diubah. Buka file Anda dan temukan ini:
<EntityType Name="table_name">
Di dekatnya, Anda mungkin akan melihat beberapa teks yang dikomentari memperingatkan Anda bahwa itu tidak memiliki kunci utama yang diidentifikasi, sehingga kunci itu telah disimpulkan dan definisi adalah tabel / tampilan read-only. Anda dapat meninggalkannya atau menghapusnya. Saya menghapusnya.
Di bawah ini adalah
<Key>
tag. Inilah yang akan digunakan oleh Entity Framework untuk melakukan penyisipan / perbarui / hapus. JADI PASTIKAN ANDA MELAKUKAN HAK INI. Properti (atau properti) dalam tag itu perlu menunjukkan baris yang dapat diidentifikasi secara unik. Sebagai contoh, katakanlah saya tahu meja sayaorders
, walaupun tidak memiliki kunci utama, dijamin hanya memiliki satu nomor pesanan per pelanggan.Jadi milikku terlihat seperti:
Serius, jangan lakukan ini salah. Katakanlah meskipun tidak boleh ada duplikat, entah bagaimana dua baris masuk ke sistem saya dengan nomor pesanan dan nama pelanggan yang sama. Astaga! Itulah yang saya dapatkan karena tidak menggunakan kunci! Jadi saya menggunakan Entity Framework untuk menghapusnya. Karena saya tahu duplikat adalah satu-satunya pesanan yang dimasukkan hari ini, saya melakukan ini:
Tebak apa? Saya baru saja menghapus duplikat DAN yang asli! Itu karena saya mengatakan kepada Entity Framework bahwa order_number / cutomer_name adalah kunci utama saya. Jadi ketika saya mengatakannya untuk menghapus duplikat Order, apa yang dilakukan di latar belakang adalah sesuatu seperti:
Dan dengan peringatan itu ... Anda sekarang harus pergi dengan baik!
sumber
Ini juga dapat terjadi jika model data ketinggalan zaman.
Semoga ini akan menyelamatkan orang lain frustrasi :)
sumber
Saya mendapatkan pesan kesalahan yang sama, tetapi dalam skenario saya, saya mencoba memperbarui entitas yang berasal dari hubungan banyak-ke-banyak menggunakan PJT (Pure Join Table).
Dari membaca posting lain, saya pikir saya bisa memperbaikinya dengan menambahkan bidang PK tambahan ke tabel bergabung ... Namun, jika Anda menambahkan kolom PK ke tabel bergabung, itu bukan lagi PJT dan Anda kehilangan semua keuntungan kerangka kerja entitas seperti pemetaan hubungan otomatis antara entitas.
Jadi solusi dalam kasus saya adalah mengubah tabel join pada DB untuk membuat PK yang mencakup KEDUA kolom ID asing.
sumber
kesalahan dapat terjadi, jika tabel Anda tidak memiliki kunci utama, dalam hal ini tabelnya adalah "hanya baca", dan perintah db.SaveChanges () selalu akan membawa kesalahan
sumber
Atur Primary Key kemudian simpan Table dan Refresh kemudian pergi ke Table.edmx delete Table dan dapatkan lagi.
sumber
jadi itu benar, cukup tambahkan kunci utama
Catatan: pastikan bahwa ketika Anda memperbarui diagram EF Anda dari basis data yang Anda tunjuk ke basis data yang tepat , dalam kasus saya string koneksi menunjuk ke DB lokal alih-alih Dev DB terbaru, anak sekolah kesalahan yang saya tahu, tetapi saya ingin memposting ini karena bisa sangat membuat frustasi jika Anda yakin Anda telah menambahkan kunci utama dan Anda masih mendapatkan kesalahan yang sama
sumber
Saya memiliki masalah yang sama. Seperti kata utas ini, Meja saya tidak memiliki PK, jadi saya mengatur PK dan menjalankan kode. Namun sayangnya kesalahan datang lagi. Apa yang saya lakukan selanjutnya adalah, menghapus koneksi DB (menghapus file .edmx di folder Model Solution Explorer) dan membuatnya kembali. Kesalahan hilang setelah itu. Terima kasih semuanya telah berbagi pengalaman Anda. Ini menghemat banyak waktu.
sumber
Saya mendapatkan masalah ini karena saya menghasilkan EDMX saya dari database yang ada (dirancang oleh orang lain, dan saya menggunakan istilah 'dirancang' secara longgar di sini).
Ternyata meja tidak punya kunci sama sekali. EF menghasilkan model dengan banyak tombol. Saya harus menambahkan kunci utama ke tabel db di SQL dan kemudian memperbarui model saya di VS.
Itu memperbaikinya bagi saya.
sumber
Ini bukan jawaban baru tetapi akan membantu seseorang yang tidak yakin cara mengatur kunci utama untuk tabel mereka. Gunakan ini dalam kueri baru dan jalankan. Ini akan menetapkan kolom UniqueID sebagai kunci utama.
sumber
Dalam kasus saya, lupa mendefinisikan Kunci Utama ke Tabel. Jadi tetapkan seperti yang ditunjukkan pada Gambar dan Perbarui tabel Anda dari "Perbarui model dari Database" dari file .edmx Semoga ini bisa membantu !!!
sumber
Menambahkan kunci utama juga berfungsi untuk saya!
Setelah selesai, berikut ini cara memperbarui model data tanpa menghapusnya -
Klik kanan pada halaman desainer Entitas edmx dan 'Perbarui Model dari Database'.
sumber
Saya memiliki masalah yang sama persis, sayangnya, menambahkan kunci utama tidak menyelesaikan masalah. Jadi, inilah cara saya menyelesaikan masalah saya:
primary key
di atas meja, jadi saya mengubah tabel saya dan menambahkan kunci utama.Delete the ADO.NET Entity Data Model
(file edmx) tempat saya gunakan untuk memetakan dan terhubung dengan database saya.Add again a new file of ADO.NET Entity Data Model
untuk terhubung dengan database saya dan untuk memetakan properti model saya.Clean and rebuild the solution.
Masalah terpecahkan.
sumber
cukup tambahkan kunci utama ke meja Anda dan buat ulang EF Anda
sumber
Saya hanya perlu menghapus tabel dari model dan memperbarui model lagi membawa tabel kembali. Saya kira kunci utama dibuat setelah tabel ditarik ke dalam model.
sumber
Saya mengalami masalah ini dan percaya itu disebabkan karena saya telah menghapus Indeks pada kunci utama tabel saya dan menggantinya dengan indeks pada beberapa bidang lain dalam tabel.
Setelah saya menghapus indeks kunci utama dan menyegarkan edmx, sisipan berhenti berfungsi.
Saya me-refresh tabel ke versi yang lebih lama, me-refresh edmx dan semuanya berfungsi lagi.
Saya harus mencatat bahwa ketika saya membuka EDMX untuk memecahkan masalah ini, memeriksa untuk melihat apakah ada kunci primer yang ditentukan, ada. Jadi tidak ada saran di atas yang membantu saya. Tetapi menyegarkan indeks pada kunci utama sepertinya berhasil.
sumber
Buka file .edmx Anda dalam editor XML dan kemudian hapus tag dari Tag dan juga ubah store: Schema = "dbo" ke Schema = "dbo" dan bangun kembali solusi sekarang kesalahan akan menyelesaikan dan Anda akan dapat menyimpan data.
sumber
Saya menemukan jawaban asli untuk memperbarui file .edmx paling baik dalam situasi saya. Saya hanya tidak terlalu senang mengubah model setiap kali itu diperbarui dari database. Itu sebabnya saya menulis file Template Teks tambahan, yang secara otomatis dipanggil ketika setelah model telah berubah - sama seperti entitas yang baru dibuat. Saya memposting di sini di komentar ini. Untuk membuatnya berfungsi, pastikan Anda menamainya seperti {model name} .something.tt, dan simpan di folder yang sama dengan folder .edmx Anda. Saya menamainya {nama model} .NonPkTables.tt. Itu tidak menghasilkan file sendiri karena definisi ekstensi file tidak valid di baris kedua. Jangan ragu untuk menggunakannya.
sumber
Saya menghadapi pesan kesalahan yang sama untuk menyisipkan catatan di tabel yang memiliki hubungan Many-to-Many . Skema basis data saya adalah:
Tabel Student dan Course masing-masing memiliki ID dan Kode kunci utama , sedangkan tabel Student-Course memiliki dua kunci asing yang dipetakan dengan tabel Student dan Course.
Logikanya, skema sudah benar tetapi saya membuat kesalahan dalam Database, karena setiap tabel harus memiliki kunci utama.
Definisi sql saya untuk Kursus Siswa adalah:
Saya menjadikan sepasang kunci asing sebagai kunci utama tabel ini dan diperbarui ke:
Semoga ini bisa menyelesaikan masalah bagi sebagian cowok.
sumber