Merhaba,
Başlıktaki hatayı alma nedenim ile sizin buralara kadar gelmiş olma nedeniniz aynı olmalı 🙂
Kısaca açıklamak gerekirse, code first ile database i inşa ettiğiniz senaryolarda, X tablonuzda kolon isminiz CIVATA idi. Siz de daha sonra “bu kolon ismi ile olmadı, ben bunu tablo haline getireyim, bu class a da navigation vereyim” deyip CIVATA property’sini yorum satırına aldınız veya tamamen sildiniz entity’nizden. Onun yerine de CIVATA isminde tablo oluşturdunuz ve artık ID sini X class ınıza CIVATA_ID olarak verdiniz (eklediniz).
add-migration dedikten sonra otomatik olarak oluşan migration class ınızda UP (update-database ile çalışacak olan kısım) metodunda X tablonuzdan CIVATA kolonunu DROP ettiğini,CIVATA_ID sini ise ADD ile eklediğini gördünüz.
Sonra dediniz ki CIVATA kolonunu DROP etmeden hemen önce ben şu X tablosundaki CIVATA_ID yi CIVATA tablosundaki karşılığı ne ise onunla UPDATE edeyim migration class ımda.Misal;
migrationBuilder.UpdateData(
table: "X",
keyColumn: "CIVATA",//where kısmı
keyValue: "Büyük Civata 10mm'lik",
column: "Civata_ID",//set kısmı
value: new Guid("c5585533-df42-48c6-8e03-d69fb6bf27a1"));
update-database ile değişiklikleri almaya çalıştığı anda uyarıyı yakacaktır.
There is no property mapped to the column ‘Table.Column’ which is used in a data operation. Either add a property mapped to this column, or specify the column types in the data operation
Sebebi ise o an ki migration class ınızın designer’ında X class ı property lerinde CIVATA property sinin görünmeyişidir. Görünmeme nedeni de çok basit, güncel property leri tutuyor.
Up methodu altında CIVATA kolonunu drop etmeden önce UPDATE i hazırlamamış olmamız bir şey ifade etmiyor yani. Hızlıca işlemleri yaparken gözden kaçan bu kural nedeniyle aldığım hata ile ilgili de yazmak istedim.
Neyse gelelim “çözüm nasıl olacak?” kısmına ?
Migration class ında çalışmasını istediğimiz update leri method yardımıyla çalıştırmak istiyorsak (ki down tarafında da ilgili update lerin tersini yazmayı unutmamamız gerek, ileride remove migration esnasında lazım olacaktır.) aşağıdaki gibi ilerlenebilir.
- X class ınıza gidip, silinen CIVATA property si tekrar geri eklenir
- migration class ınızı yeniden oluşturulur
- tekrar db yi update edilir
- sonra tekrar X class ınıza gidip, CIVATA property si tekrar silinir
- migration class ını tekrar oluşturulur
- db yi tekrar update edilir
bu evet biraz uzun yöntem oldu.
Kısası için ise, sql cümleciklerini method yerine raw sql ile dropcolumn lardan önce yazmak; Misal;
migrationBuilder.Sql("UPDATE x SET Civata_ID = new Guid('c5585533-df42-48c6-8e03-d69fb6bf27a1') WHERE CIVATA= 'Büyük Civata 10mm'lik' ");
bunu yazdıktan sonra
migrationBuilder.DropColumn(
name: "CIVATA",
table: "X");
kolonu düşürürseniz hata almayız, çünkü raw olarak yazılan sql cümleciği snapshot modeli kontrol etmiyor, direkt olarak db ye gidip çalıştırıyor. biz de henüz ilgili kolon düşürmediğimiz için hatayı önlemiş oluruz. eğer kolonu raw sql den önce düşürdüyseniz bu sefer de invalid kolon hatası alınır…
iyi çalışmalar…..