我在我的项目中使用 NHibernate & Net Persistence API 和 C# 和 MySql db,我有 UI 层 (ASP.NET)、业务层和数据访问层 (DAL)。我在 DAL 的 UserManager 类中有以下保存方法:
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。但是说下次(任何时候,不是在同一个会话中)如果我尝试修改用户详细信息,那么它不会触发更新命令,而是触发插入,并使用修改用户实体插入一条新记录。我正在将用户的主键正确设置为修改后的对象。
此外,当我使用 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 引擎。
谁能告诉我为什么它不更新现有的用户实体?相反,它正在使用修改后的实体创建新记录?