Saya menggunakan NHibernate & Net Persistence API dengan C# dan MySql db di proyek saya dan saya memiliki lapisan UI (ASP.NET), Lapisan Bisnis, dan Lapisan Akses Data (DAL). Saya memiliki metode Simpan berikut di kelas UserManager DAL:
private EntityManager GetEm()
{
if (_entityManager == null)
{
_entityManagerFactory = Persistence.CreateEntityManagerFactory("JPUMain");
_entityManager = _entityManagerFactory.CreateEntityManager();
}
return _entityManager;
}
public void **Save**(IGenericEntity entity)
{
_entityManager = GetEm();
_entityManager.GetTransaction().Begin();
_entityManager.Persist(entity);
_entityManager.Flush();
_entityManager.GetTransaction().Commit();
_entityManager.Clear();
}
Entitas Pengguna Saya:
[Entity]
[Table(Name = "user")]
public class User : IGenericEntity
{
[Id]
[GeneratedValue]
public virtual int ID { get; set; }
[Basic]
[Column(Name = "fname", Nullable = false)]
public virtual string FirstName { get; set; }
[Basic]
[Column(Name = "lname", Nullable = false)]
public virtual string LastName { get; set;
}
Sekarang jika saya mencoba menyelamatkan pengguna dengan menelepon:
UserManager.save(user)
kemudian menyimpan entri ke db dengan benar. Namun katakan lain kali (kapan saja, tidak dalam sesi yang sama) jika saya mencoba mengubah detail pengguna, maka alih-alih menjalankan perintah pembaruan, perintah tersebut akan mengaktifkan penyisipan, dan menyisipkan catatan baru dengan entitas pengguna modifikasi. Saya mengatur kunci utama pengguna dengan benar ke objek yang dimodifikasi.
Juga, ketika saya menjalankan test case untuk hal yang sama menggunakan NUnit, ia mencetak baris berikut:
NHibernate: SELECT LAST_INSERT_ID()
NHibernate: INSERT INTO user (uid, fname, lname) VALUES (?p0, ?p1, ?p2);?p0 = 2[Type: Int32 (0)], ?p1 = 'First Name' [Type: String (9)], ?p2 = 'Last Name' [Type: String (9)]
Saya mencoba menjalankan pernyataan ini langsung dari phpmyadmin di tabel pengguna, dan selalu memberikan nilai 0. Saya menggunakan mesin InnoDB.
Adakah yang bisa memberi tahu saya mengapa entitas pengguna yang ada tidak diperbarui? dan malah membuat rekor baru dengan entitas yang dimodifikasi?