SQLite göreli yolu, çalıştığın dizine göre farklı dosya bulur
Bir ASP.NET Core + SQLite projesinde, çözülmesi anlaşılması zor bir hataya rastlamışlar: poliçe formu bazen 404, bazen 500 dönüyor, ama tutarlı değil.
Sebep: Data Source bağlantı dizesindeki göreli yol, ASP.NET Core’un content root’una göre çözülüyordu. dotnet run komutu repo kökünden çalıştırılırsa bir yere, src/EmfiSigorta.Api içinden çalıştırılırsa başka bir yere bakıyordu. Sonuç: aynı SQLite dosyasının iki farklı fiziksel kopyası — biri güncelleniyor, diğeri okunuyor.
Çözüm, göreli yolu content root’a değil, repoya göre sabitlemek. AppContext.BaseDirectory’den başlayıp yukarı doğru .sln dosyası aranıyor, bulunduğu dizin “repo kökü” kabul edilip bağlantı dizesi ona göre mutlak yola çevriliyor. Hem API hem içe aktarım aracı aynı çözümleyiciyi paylaşıyor, ikisi de aynı veritabanına bakacağından emin olunuyor.
Kod içindeki yorum meseleyi net anlatıyor:
// Daha önce ASP.NET Core content root'una göre çözülen davranış,
// biri yanlışlıkla '../../' önekini unutunca veritabanının
// src/EmfiSigorta.Api/ içinde sessizce ikinci bir kopyasının
// oluşmasına yol açıyordu.
Bunu neden önemsiyorum: “sessizce ikinci bir kopya” ifadesi tam da bu tür hataları tehlikeli yapan şey. Hata mesajı vermiyor, sadece davranış tutarsızlaşıyor. Göreli yol kullanan her yapılandırma için sorulması gereken soru: “bu, neye göre göreli?” — cevap “çalıştığın dizin” ise, o dizin garanti edilmediği sürece bu bir zaman bombası.