Memiliki dua kelas:
public class Parent
{
public int Id { get; set; }
public int ChildId { get; set; }
}
public class Child { ... }
Ketika menetapkan ChildId
untuk Parent
harus saya cek dulu jika ada di DB atau menunggu DB untuk melemparkan pengecualian?
Misalnya (menggunakan Entity Framework Core):
Perhatikan jenis-jenis cek ini SELURUH INTERNET, bahkan pada dokumen resmi Microsoft: https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using- mvc / handling-concurrency-with-the-entitas-framework-in-an-asp-net-mvc-application #odifikasi-departemen-pengontrol tetapi ada penanganan pengecualian tambahan untukSaveChanges
juga, perhatikan bahwa maksud utama dari pemeriksaan ini adalah untuk mengembalikan pesan ramah dan status HTTP yang diketahui kepada pengguna API dan tidak sepenuhnya mengabaikan pengecualian basis data. Dan satu-satunya pengecualian tempat yang dibuang adalah di dalam SaveChanges
atau SaveChangesAsync
menelepon ... jadi tidak akan ada pengecualian saat Anda menelepon FindAsync
atau Any
. Jadi jika anak ada tetapi sudah dihapus sebelumnya SaveChangesAsync
maka pengecualian concurrency akan dibuang.
Saya melakukan ini karena fakta bahwa foreign key violation
pengecualian akan jauh lebih sulit untuk memformat untuk menampilkan "Anak dengan id {parent.ChildId} tidak dapat ditemukan."
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;
}
melawan:
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;
}
Contoh kedua di Postgres akan menampilkan 23503 foreign_key_violation
kesalahan: https://www.postgresql.org/docs/9.4/static/errcodes-appendix.html
Kelemahan dari penanganan pengecualian dengan ORM seperti EF adalah bahwa hal itu hanya akan bekerja dengan backend basis data tertentu. Jika Anda pernah ingin beralih ke SQL server atau yang lain ini tidak akan berfungsi lagi karena kode kesalahan akan berubah.
Tidak memformat pengecualian dengan benar untuk pengguna akhir dapat memaparkan beberapa hal yang tidak ingin dilihat oleh siapa pun selain oleh pengembang.
Terkait:
https://stackoverflow.com/questions/308905/should-there-be-a-ttransaction-for-read-queries
Child with id {parent.ChildId} could not be found.
. Dan memformat "Pelanggaran kunci asing" Saya pikir lebih buruk dalam kasus ini.