İki sınıfa sahip olmak:
public class Parent
{
public int Id { get; set; }
public int ChildId { get; set; }
}
public class Child { ... }
Atama yaparken önce DB'de ChildId
olup Parent
olmadığını kontrol etmeli miyim yoksa DB'nin bir istisna atmasını beklemeli miyim?
Örneğin (Entity Framework Çekirdeğini kullanarak):
NOT: Bu tür kontroller resmi Microsoft'un dokümanlarında bile İNTERNET ÜZERİNDEKİ TÜMLERDİR: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using- mvc / processing-eşzamanlılık-ile-varlık-çerçeve-bir-asp-net-mvc-uygulama # departman-denetleyicisi-değişiklik ama ek istisna işlemeSaveChanges
Ayrıca, bu kontrolün asıl amacının API mesajını kullananlara dostça bir mesaj ve bilinen HTTP durumu döndürmek ve veritabanı istisnalarını tamamen görmezden gelmemek olduğunu unutmayın. Ve atılmasına tek yer istisna içinde olduğunu SaveChanges
veya SaveChangesAsync
çağrı Aradığınızda yüzden herhangi bir istisna olmayacaktır ... FindAsync
ya Any
. Öyleyse eğer çocuk varsa, ancak daha önce silinmişse SaveChangesAsync
eşzamanlılık istisnası atılır.
Bunu, foreign key violation
"{kimliği olan {parent.ChildId} çocuğu bulunamadı" ifadesini görüntülemek için istisnaların biçimlendirilmesinin daha zor olacağı gerçeği nedeniyle yaptım .
public async Task<ActionResult<Parent>> CreateParent(Parent parent)
{
// is this code redundant?
// NOTE: its probably better to use Any isntead of FindAsync because FindAsync selects *, and Any selects 1
var child = await _db.Children.FindAsync(parent.ChildId);
if (child == null)
return NotFound($"Child with id {parent.ChildId} could not be found.");
_db.Parents.Add(parent);
await _db.SaveChangesAsync();
return parent;
}
e karşı:
public async Task<ActionResult<Parent>> CreateParent(Parent parent)
{
_db.Parents.Add(parent);
await _db.SaveChangesAsync(); // handle exception somewhere globally when child with the specified id doesn't exist...
return parent;
}
Postgres'teki ikinci örnek 23503 foreign_key_violation
hata verecektir : https://www.postgresql.org/docs/9.4/static/errcodes-appendix.html
EF gibi ORM'deki istisnaların bu şekilde ele alınmasının olumsuz tarafı, yalnızca belirli bir veritabanı arka ucuyla çalışacak olmasıdır. SQL sunucusuna ya da başka bir şeye geçmek istemeniz durumunda, hata kodu değişeceğinden bu artık işe yaramayacak.
Özel durumun son kullanıcı için doğru şekilde biçimlendirilmemesi, hiç kimsenin istemediği ancak geliştiricilerin görmesini istemediğiniz bazı şeyleri ortaya çıkarabilir.
İlgili:
https://stackoverflow.com/questions/308905/should-there-be-a-transaction-for-read-queries
Child with id {parent.ChildId} could not be found.
. Ve "Yabancı anahtar ihlali" biçimlendirmek bu durumda daha kötü olduğunu düşünüyorum.