У меня есть POCO и соответствующий файл карты nHibernate (Contractor.hbm.xml)
POCO:
public partial class Contractor : System.IComparable
{
protected int id;
protected string name;
protected string licenseNumber;
public virtual int ContractorId
{ get { return this.id; }
set { this.id = value; }
}
public virtual string Name
{ get { return this.name; }
set { this.name = value; }
}
public virtual string LicenseNumber
{ get { return this.licenseNumber; }
set { this.licenseNumber = value; }
}
public virtual int CompareTo(object obj)
{
if (!(obj is Contractor))
{ throw new System.InvalidCastException("This object is not of type Contractor"); }
return this.Name.CompareTo(((Contractor)obj).Name);
}
}
}
Таблица в базе данных (первая строка намеренно пуста):
Имя Подрядчика Имя Подрядчика Номер лицензии
0
1 Smith Inc A12345
43 Джо, ООО B4C5t6
4 SureFix Co. 77987
77 ReadyMix 009ABCV
Через GUI пользователь меняет номер лицензии существующего подрядчика
Допустим, номер лицензии Smith Inc изменен, теперь POCO выглядит следующим образом: *
Подрядчик
ContractorId: 1
Имя: Смит Inc
Номер лицензии: New123Num
Теперь я хочу сохранить это в базе данных. Если я делаю SaveOrUpdate(contractor)
, я получаю NonUniqueObjectException
исключение. Если я сделаю Merge(contractor)
, ничего не произойдет, т.е. не возникнет никаких исключений, но база данных не будет обновлена с новым номером лицензии.
Изменить: теперь я вижу, что объект не содержится в сеансе. Как я могу получить это там?
public virtual T SaveOrUpdate(T contractor)
{
NHibernate.ITransaction tx = null;
try
{
using (ITransaction transaction = this.Session.BeginTransaction())
{
Session.SaveOrUpdate(contractor);
transaction.Commit();
}
}
catch (System.Exception ex)
{
tx.Rollback();
Session.Close();
throw ex;
}
return entity;
}
public virtual T Merge (T contractor)
{
using (ITransaction transaction = this.Session.BeginTransaction())
{
try
{
Session.Merge(contractor);
transaction.Commit();
}
catch (System.Exception ex)
{
transaction.Rollback();
Session.Close();
throw ex;
}
}
return entity;
}
файл сопоставления:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
<class name="Contractor, Infrastructure.Interface"
table="tblContractor"
mutable="false">
<id name="ContractorId" type="Int32" unsaved-value="0">
<column name="ContractorId" sql-type="int" not-null="true" unique="true" index="PK_tblContractor" />
<generator class="native" />
</id>
<property name="Name" type="String">
<column name="Name" length="255" sql-type="text" not-null="false" />
</property>
<property name="LicenseNumber" type="String">
<column name="LicenseNumber" length="50" sql-type="text" not-null="false" />
</property>
</class>
</hibernate-mapping>