Обновить / объединить строку в базе данных - PullRequest
0 голосов
/ 08 мая 2018

У меня есть 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...