新建对象
通过调用ISession.Save()方法,然后同步同步到数据库。
例子:在数CRUD.cs类中编写CreateCustomer()方法,把传过来的Customer对象保存在数据库中。
[csharp] view plaincopy
/// <summary>
/// 新建对象
/// </summary>
/// <param name="customer"></param>
/// <returns></returns>
public int CreateCustomer(Customer customer)
{
int newid = (int)_session.Save(customer );
_session.Flush();
return newid;
}
测试这个方法。新建一个Customer对象,调用CreateCustomer()方法返回新插入的CustomerId,再次根据CustomerId查询数据库是否存在这个对象。
[csharp] view plaincopy
/// <summary>
/// 创建测试
/// </summary>
[Test]
public void CreateCustomerTest()
{
var customer = new Customer() { Firstname = "Lianhai", Lastname = "Zhang" };
int newIdentity = _crud.CreateCustomer(customer);
var testCustomer = _crud.GetCustomerById(newIdentity);
Assert.IsNotNull(testCustomer);
}
看一下测试效果图:
数据库中的结果:
删除对象
查出一个对象,调用ISession.Delete(),同步到数据库。
但是这种方法也有个问题,这种方法要先把这条记录查出来(SELECT),然后映射成实体,再把实体传回去执行删除操作(DELETE)。这样处理可能能够解决缓存与数据库同步等一系列问题。
HQL是NHibernate特有的操作语言,它能够理解,既然能理解那么就能正常处理与缓存的关系(未实测),不过跟踪了SQL语句,还是先查询后删除,唯一不同只是返回多了一个影响行数。
如果不使用NHibernate的缓存功能,可以考虑使用CreateSQLQuery的方式删除,在这里忽略了,后续博客将会介绍。
例:在数据访问层编写DeleteCustomer()方法,从数据库中删除Customer对象。
[csharp] view plaincopy
/// <summary>
/// 删除对象
/// </summary>
/// <param name="customer"></param>
public void DeleteCustomer(Customer customer)
{
_session.Delete(customer);
_session.Flush();
}
测试这个方法。在数据库中查询CustomerId为1的Customer对象,调用DeleteCustomer()方法删除,再次根据CustomerId查询数据库是否存在这个对象。
[csharp] view plaincopy
/// <summary>
/// 删除测试
/// </summary>
[Test]
public void DeleteCustomerTest()
{
var coutomer = _crud.GetCustomerById(1);
_crud.DeleteCustomer(coutomer);
var testCustomer = _crud.GetCustomerById(1);
Assert.IsNull(testCustomer);
}
不知为什么,测试结果Delete语句没出来,但是数据库中已经变化了。(下面的更新与保存更新同样没出来相应的语句,测试的图就暂时不贴了)直接看一下数据库中的结果吧。那条记录已经不在了。
更新对象
获取一个对象;改变它的一些属性;调用ISession.Update();同步ISession。
例:在数据访问层编写UpdateCustomer()方法,修改Customer对象。
[csharp] view plaincopy
/// <summary>
/// 更新对象
/// </summary>
/// <param name="customer"></param>
public void UpdateCustomer(Customer customer)
{
_session.Update(customer);
_session.Flush();
}
测试这个方法。在数据库中查询CustomerId为2的Customer对象并修改它的Firstname属性值,调用UpdateCustomer()方法更新,再次查询数据库中CustomerId为1的Customer对象的Firstname值为修改之后的值。
[csharp] view plaincopy
/// <summary>
/// 更新测试
/// </summary>
[Test]
public void UpdateCustomerTest()
{
var customer = _crud.GetCustomerById(2);
customer.Firstname = "lh";
_crud.UpdateCustomer(customer);
var testCustomer = _crud.GetCustomerById(2);
Assert.AreEqual("lh", customer.Firstname);
}
看一下数据库中的结果,“Lianhai”改为“lh”了:
保存更新对象
你会不会想出这个问题?哪些是刚刚创建的对象,哪些是修改过的对象?对于刚刚创建的对象我们需要保存到数据库中,对于修改过的对象我们需要更新到数据库中。NHibernate能够做到自动判断是应该执行INSERT还是UPDATE。这就是SaveOrUpdate()方法,当我们执行这个方法的时候,NHibernate完成如下工作:
检查这个对象是否已经存在Session中。
如果对象不在,调用Save(object)来保存。
如果对象存在,检查这个对象是否改变了。
如果对象改变,调用Update(object)来更新。
看看下面例子说明了这种情况,在数据访问层编写SaveOrUpdateCustomer()方法,保存更新Customer对象列表,依次遍历列表中的Customer对象,调用ISession.SaveOrUpdate(object)方法保存更新每个Customer对象。
[csharp] view plaincopy
/// <summary>
/// 保存更新对象
/// </summary>
/// <param name="customer"></param>
public void SaveOrUpdateCustomer(IList<Customer> customer)
{
foreach (var c in customer)
{
_session.SaveOrUpdate(c);
}
_session.Flush();
}
测试这个方法。先在数据库中查询Firstname为lh的那个Customer对象并修改它的Lastname属性值,这个对象是数据库中存在的,并改变了,然后新建2个Customer对象,这两个对象在数据库中不存在,是新创建的。调用SaveOrUpdateCustomer()方法保存更新对象,即更新前面修改的对象和保存了后面新创建的2个对象。
[csharp] view plaincopy
/// <summary>
/// 保存更新测试
/// </summary>
[Test]
public void SaveOrUpdateCustomerTest()
{
IList<Customer> customers=new List<Customer>() ;
var oldCustomer = _crud.GetCustomerById(2);
oldCustomer.Lastname = "张";
customers.Add(oldCustomer);
var c1 = new Customer() { Firstname = "Lianhai", Lastname = "Zhang" };
var c2 = new Customer() { Firstname = "Lianhai", Lastname = "Zhang" };
customers.Add(c1);
customers.Add(c2);
_crud.SaveOrUpdateCustomer(customers);
}
看一下数据库,第一条数据是更新的,下面是新添加上的:
通过调用ISession.Save()方法,然后同步同步到数据库。
例子:在数CRUD.cs类中编写CreateCustomer()方法,把传过来的Customer对象保存在数据库中。
[csharp] view plaincopy
/// <summary>
/// 新建对象
/// </summary>
/// <param name="customer"></param>
/// <returns></returns>
public int CreateCustomer(Customer customer)
{
int newid = (int)_session.Save(customer );
_session.Flush();
return newid;
}
测试这个方法。新建一个Customer对象,调用CreateCustomer()方法返回新插入的CustomerId,再次根据CustomerId查询数据库是否存在这个对象。
[csharp] view plaincopy
/// <summary>
/// 创建测试
/// </summary>
[Test]
public void CreateCustomerTest()
{
var customer = new Customer() { Firstname = "Lianhai", Lastname = "Zhang" };
int newIdentity = _crud.CreateCustomer(customer);
var testCustomer = _crud.GetCustomerById(newIdentity);
Assert.IsNotNull(testCustomer);
}
看一下测试效果图:
数据库中的结果:
删除对象
查出一个对象,调用ISession.Delete(),同步到数据库。
但是这种方法也有个问题,这种方法要先把这条记录查出来(SELECT),然后映射成实体,再把实体传回去执行删除操作(DELETE)。这样处理可能能够解决缓存与数据库同步等一系列问题。
HQL是NHibernate特有的操作语言,它能够理解,既然能理解那么就能正常处理与缓存的关系(未实测),不过跟踪了SQL语句,还是先查询后删除,唯一不同只是返回多了一个影响行数。
如果不使用NHibernate的缓存功能,可以考虑使用CreateSQLQuery的方式删除,在这里忽略了,后续博客将会介绍。
例:在数据访问层编写DeleteCustomer()方法,从数据库中删除Customer对象。
[csharp] view plaincopy
/// <summary>
/// 删除对象
/// </summary>
/// <param name="customer"></param>
public void DeleteCustomer(Customer customer)
{
_session.Delete(customer);
_session.Flush();
}
测试这个方法。在数据库中查询CustomerId为1的Customer对象,调用DeleteCustomer()方法删除,再次根据CustomerId查询数据库是否存在这个对象。
[csharp] view plaincopy
/// <summary>
/// 删除测试
/// </summary>
[Test]
public void DeleteCustomerTest()
{
var coutomer = _crud.GetCustomerById(1);
_crud.DeleteCustomer(coutomer);
var testCustomer = _crud.GetCustomerById(1);
Assert.IsNull(testCustomer);
}
不知为什么,测试结果Delete语句没出来,但是数据库中已经变化了。(下面的更新与保存更新同样没出来相应的语句,测试的图就暂时不贴了)直接看一下数据库中的结果吧。那条记录已经不在了。
更新对象
获取一个对象;改变它的一些属性;调用ISession.Update();同步ISession。
例:在数据访问层编写UpdateCustomer()方法,修改Customer对象。
[csharp] view plaincopy
/// <summary>
/// 更新对象
/// </summary>
/// <param name="customer"></param>
public void UpdateCustomer(Customer customer)
{
_session.Update(customer);
_session.Flush();
}
测试这个方法。在数据库中查询CustomerId为2的Customer对象并修改它的Firstname属性值,调用UpdateCustomer()方法更新,再次查询数据库中CustomerId为1的Customer对象的Firstname值为修改之后的值。
[csharp] view plaincopy
/// <summary>
/// 更新测试
/// </summary>
[Test]
public void UpdateCustomerTest()
{
var customer = _crud.GetCustomerById(2);
customer.Firstname = "lh";
_crud.UpdateCustomer(customer);
var testCustomer = _crud.GetCustomerById(2);
Assert.AreEqual("lh", customer.Firstname);
}
看一下数据库中的结果,“Lianhai”改为“lh”了:
保存更新对象
你会不会想出这个问题?哪些是刚刚创建的对象,哪些是修改过的对象?对于刚刚创建的对象我们需要保存到数据库中,对于修改过的对象我们需要更新到数据库中。NHibernate能够做到自动判断是应该执行INSERT还是UPDATE。这就是SaveOrUpdate()方法,当我们执行这个方法的时候,NHibernate完成如下工作:
检查这个对象是否已经存在Session中。
如果对象不在,调用Save(object)来保存。
如果对象存在,检查这个对象是否改变了。
如果对象改变,调用Update(object)来更新。
看看下面例子说明了这种情况,在数据访问层编写SaveOrUpdateCustomer()方法,保存更新Customer对象列表,依次遍历列表中的Customer对象,调用ISession.SaveOrUpdate(object)方法保存更新每个Customer对象。
[csharp] view plaincopy
/// <summary>
/// 保存更新对象
/// </summary>
/// <param name="customer"></param>
public void SaveOrUpdateCustomer(IList<Customer> customer)
{
foreach (var c in customer)
{
_session.SaveOrUpdate(c);
}
_session.Flush();
}
测试这个方法。先在数据库中查询Firstname为lh的那个Customer对象并修改它的Lastname属性值,这个对象是数据库中存在的,并改变了,然后新建2个Customer对象,这两个对象在数据库中不存在,是新创建的。调用SaveOrUpdateCustomer()方法保存更新对象,即更新前面修改的对象和保存了后面新创建的2个对象。
[csharp] view plaincopy
/// <summary>
/// 保存更新测试
/// </summary>
[Test]
public void SaveOrUpdateCustomerTest()
{
IList<Customer> customers=new List<Customer>() ;
var oldCustomer = _crud.GetCustomerById(2);
oldCustomer.Lastname = "张";
customers.Add(oldCustomer);
var c1 = new Customer() { Firstname = "Lianhai", Lastname = "Zhang" };
var c2 = new Customer() { Firstname = "Lianhai", Lastname = "Zhang" };
customers.Add(c1);
customers.Add(c2);
_crud.SaveOrUpdateCustomer(customers);
}
看一下数据库,第一条数据是更新的,下面是新添加上的: