Saya telah mempersempit ini menjadi beberapa masalah antara Code First dan Database first EF, tapi saya tidak yakin bagaimana cara memperbaikinya. Saya akan mencoba sejelas mungkin, tetapi sejujurnya saya sendiri kehilangan beberapa pemahaman di sini. Ini adalah Entity Framework 4.4
Saya mewarisi sebuah proyek di mana Entity Framework digunakan, tetapi banyak dari file sebenarnya telah dihapus tanpa cara nyata untuk kembali. Saya menambahkan kembali EF (Database terlebih dahulu) dan mereplikasi pengaturan T4 di mana proyek tersebut dibuat. Ini menghasilkan versi kode dari semua model database dan file kode DBContext.
Jika string koneksi saya terlihat seperti string koneksi .NET "normal", saya mendapatkan kesalahan tentang kolom yang tidak valid Nama "ProcessState_ID" tidak ada. ProcessState_ID sama sekali tidak ada di basis kode, tidak ada di file EDMX atau apa pun. Ini tampaknya merupakan beberapa konversi EF otomatis dalam kueri.
Ketika saya membuat string koneksi cocok dengan model Entity Framework, itu berfungsi dengan baik.
Sekarang dalam mencoba untuk mencocokkan kode sebelumnya dengan Entity Framework, saya ingin mempertahankan string koneksi .NET "normal".
Jadi saya punya dua pertanyaan di sini: 1. Apa cara yang baik untuk beralih dari string koneksi normal ke string koneksi EF dalam kode? 2. Apakah ada perbaikan lain di sini yang tidak saya lihat untuk menghentikan kesalahan nama kolom yang tidak valid?
sumber
public virtual Person Person { get; }
Jawaban:
Periksa untuk melihat apakah Anda memiliki ICollections.
Apa yang saya temukan adalah ketika Anda memiliki ICollection yang mereferensikan tabel dan tidak ada kolom yang dapat dipecahkan, itu membuat satu untuk Anda coba membuat koneksi antar tabel. Ini secara khusus terjadi dengan ICollection dan telah membuat saya "gila" mencoba mencari tahu.
sumber
Ini adalah entri yang terlambat bagi mereka (seperti saya) yang tidak segera memahami 2 jawaban lainnya.
Begitu...
EF mencoba memetakan ke nama YANG DIHARAPKAN dari PARENT TABLES KEY-REFERENCE ... dan sejak ... nama FOREIGN KEY "diubah atau disingkat" dalam database relasi CHILD TABLE ... Anda akan mendapatkan pesan di atas.
(perbaikan ini mungkin berbeda di antara versi EF)
FOR ME THE FIX ADALAH:
MENAMBAHKAN atribut "ForeignKey" ke model
sumber
Category_Id
. Anda telah menyebutkan tentang perbaikan untuk versi EF yang berbeda, bukan? Saya menggunakan EF 6.0 Apa perbaikan yang dapat saya lakukan?*_ID
. Termasuk referensi belakang bekerja dengan baik.[MetadataType(typeof(MetaData))] public partial class Tour { public class MetaData { [ForeignKey(nameof(TourCategory))] public virtual TourCategory TourCategory { get; set; } } }
Astaga - setelah berjam-jam mencoba, akhirnya saya menemukan jawabannya.
Saya melakukan database EF6 terlebih dahulu dan saya bertanya-tanya tentang kesalahan "luas kolom tidak diketahui" - itu menghasilkan nama tabel garis bawah nama kolom untuk beberapa alasan, dan mencoba untuk menemukan kolom yang tidak ada.
Dalam kasus saya, salah satu tabel saya memiliki dua referensi kunci asing ke kunci utama yang sama di tabel lain - seperti ini:
EF telah menghasilkan beberapa nama kolom aneh seperti
Owners_AnimalID1
danOwners_AnimalID2
kemudian melanjutkan untuk memecahkan sendiri.Triknya di sini adalah bahwa kunci asing yang membingungkan ini perlu didaftarkan ke EF menggunakan Fluent API!
Dalam konteks database utama Anda,
OnModelCreating
ganti metode dan ubah konfigurasi entitas. Lebih disukai, Anda akan memiliki file terpisah yang memperluasEntityConfiguration
kelas, tetapi Anda dapat melakukannya secara inline.Dengan cara apa pun Anda melakukannya, Anda perlu menambahkan sesuatu seperti ini:
Dan dengan itu, EF akan (mungkin) mulai bekerja seperti yang Anda harapkan. Ledakan.
Juga, Anda akan mendapatkan kesalahan yang sama jika Anda menggunakan yang di atas dengan kolom nullable - cukup gunakan
.HasOptional()
sebagai ganti.HasRequired()
.Inilah tautan yang membuat saya melewati punuk:
https://social.msdn.microsoft.com/Forums/en-US/862abdae-b63f-45f5-8a6c-0bdd6eeabfdb/getting-sqlexception-invalid-column-name-userid-from-ef4-codeonly?forum=adonetefx
Dan kemudian, dokumen Fluent API membantu, terutama contoh kunci asing:
http://msdn.microsoft.com/en-us/data/jj591620.aspx
Anda juga dapat meletakkan konfigurasi di ujung lain kunci, seperti yang dijelaskan di sini:
http://www.entityframeworktutorial.net/code-first/configure-one-to-many-relationship-in-code-first.aspx .
Ada beberapa masalah baru yang saya hadapi sekarang, tetapi itu adalah kesenjangan konseptual besar yang hilang. Semoga membantu!
sumber
builder.HasOne(item => item.LogicalShipment).WithMany(s => s.Items).HasForeignKey(item => item.LogicalShipmentId).IsRequired();
Asumsi:
Table
OtherTable
OtherTable_ID
Sekarang pilih salah satu cara ini:
SEBUAH)
Menghapus
ICollection<Table>
Jika Anda memiliki beberapa kesalahan terkait
OtherTable_ID
saat Anda mengambilTable
, bukaOtherTable
model Anda dan pastikan Anda tidak memilikinyaICollection<Table>
di sana. Tanpa hubungan yang ditentukan, framework akan secara otomatis menganggap bahwa Anda harus memiliki FK ke OtherTable dan membuat properti tambahan ini di SQL yang dihasilkan.B)
OtherTableId
keTable
dan
OtherTableId
diTable
databasesumber
Dalam kasus saya, saya salah mendefinisikan kunci utama yang terdiri dari dua kunci asing seperti ini:
Kesalahan yang saya dapatkan adalah, "nama kolom Bar_ID tidak valid".
Menentukan kunci utama komposit dengan benar memperbaiki masalah:
sumber
Bagi saya penyebab perilaku ini adalah karena masalah dengan pemetaan yang ditentukan dengan Fluent API. Saya memiliki 2 tipe terkait, di mana tipe A memiliki objek tipe B opsional, dan tipe B memiliki banyak objek A.
Saya telah mendefinisikan pemetaan dengan api yang lancar seperti ini:
Tapi masalahnya, tipe B itu punya properti navigasi
List<A>
, jadi saya punyaSQLException Invalid column name A_Id
Saya memasang Visual Studio Debug ke EF DatabaseContext.Database.Log ke output SQL yang dihasilkan ke jendela VS Output-> Debug
Dan SQL yang dihasilkan memiliki 2 relasi dari B tabel -> satu dengan id yang benar dan yang lainnya dengan
A_Id
Masalah untuk masalah tersebut adalah, bahwa saya tidak menambahkan
B.List<A>
properti navigasi ini ke dalam pemetaan.Jadi, dalam kasus saya, pemetaan yang benar haruslah:
sumber
Dalam kasus saya, penyebab masalah ini adalah kendala FOREIGN KEY yang hilang pada database yang dimigrasi. Jadi ICollection virtual yang ada tidak berhasil dimuat.
sumber
Saya juga mengalami masalah ini dan sepertinya ada beberapa penyebab berbeda. Bagi saya itu memiliki properti id yang secara keliru didefinisikan sebagai int daripada long di kelas induk yang berisi objek navigasi. Field id dalam database didefinisikan sebagai bigint yang sesuai dengan long di C #. Ini tidak menyebabkan kesalahan waktu kompilasi tetapi menyebabkan kesalahan waktu proses yang sama seperti yang didapat OP:
sumber
Bagi saya masalahnya adalah saya memiliki tabel yang dipetakan di aplikasi saya dua kali - sekali melalui Code First, sekali melalui Database First.
Menghapus salah satunya akan menyelesaikan masalah dalam kasus saya.
sumber
Bagi saya, itu terjadi karena masalah pluralisasi EF. Untuk tabel yang diakhiri dengan sesuatu seperti "-Status", EF menganggapnya tunggal adalah "-Statu". Mengubah entitas dan nama tabel DB menjadi "-StatusTypes" memperbaikinya.
Dengan cara ini, Anda tidak perlu mengganti nama model entitas setiap kali diperbarui.
sumber
Jika Anda memiliki referensi kunci asing ke tabel yang sama lebih dari sekali, Anda dapat menggunakan InverseProperty
Sesuatu seperti ini-
sumber
Bagi saya (menggunakan Visual Studio 2017 dan model database-first di bawah Entity Framework 6.1.3), masalah hilang setelah memulai ulang Visual Studio and Rebuilding.
sumber
Dalam kasus saya, data metode benih saya masih memanggil kolom tabel yang telah dijatuhkan dalam migrasi sebelumnya. Periksa kembali pemetaan Anda jika Anda menggunakan Automapper.
sumber
Dalam kasus saya, saya sudah memiliki database (Database pertama). Terima kasih untuk semua komentar di sini, saya menemukan solusi saya:
Tabel harus memiliki hubungan tetapi nama kolom harus berbeda dan menambahkan atribut ForeignKey.
[ForeignKey ("PrestadorId")] AwmPrestadoresServicios Colaboradores virtual publik {get; set; }
Artinya, PRE_ID adalah PK, tetapi FK di tabel lain adalah PRESTADOR_ID, lalu berfungsi. Terima kasih untuk semua komentar di sini saya menemukan solusi saya. EF bekerja dengan cara yang misterius.
sumber
Jika Anda mengalami masalah ini dengan properti navigasi di tabel yang sama, Anda harus mengubah nama properti kami.
Sebagai contoh :
Anda harus berubah
AncestorId
untukPersonId
.Tampaknya EF mencoba membuat kunci
ParentId
karena tidak dapat menemukan tabel bernama Ancestor ...EDIT: Ini adalah perbaikan untuk Database dulu!
sumber