ฉันกำลังใช้ NHibernate & Net Persistence API กับ C# และ MySql db ในโปรเจ็กต์ของฉัน และฉันมีเลเยอร์ UI (ASP.NET), Business Layer และ Data Access Layer (DAL) ฉันมีวิธีบันทึกต่อไปนี้ในคลาส 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();
}
เอนทิตีผู้ใช้ของฉัน:
[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;
}
ตอนนี้ถ้าฉันพยายามบันทึกผู้ใช้ด้วยการโทร:
UserManager.save(user)
จากนั้นจะบันทึกรายการลงใน db อย่างถูกต้อง แต่พูดในครั้งถัดไป (เวลาใดก็ได้ ไม่ใช่ในเซสชันเดียวกัน) หากฉันพยายามแก้ไขรายละเอียดผู้ใช้ แทนที่จะเรียกใช้คำสั่ง update มันจะเรียกใช้งาน insert และแทรกบันทึกใหม่ด้วยเอนทิตีผู้ใช้ที่แก้ไข ฉันกำลังตั้งค่าคีย์หลักของผู้ใช้อย่างถูกต้องให้กับวัตถุที่แก้ไข
นอกจากนี้ เมื่อฉันเรียกใช้กรณีทดสอบสำหรับสิ่งเดียวกันโดยใช้ NUnit มันจะพิมพ์บรรทัดต่อไปนี้:
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)]
ฉันลองใช้คำสั่งนี้โดยตรงจาก phpmyadmin ในตารางผู้ใช้ และมันจะให้ค่าเป็น 0 เสมอ ฉันกำลังใช้เครื่องมือ InnoDB
ใครช่วยบอกฉันหน่อยได้ไหมว่าเหตุใดจึงไม่อัปเดตเอนทิตีผู้ใช้ที่มีอยู่ และกำลังสร้างบันทึกใหม่ด้วยเอนทิตีที่แก้ไขแทน