Nhibernate делает обновления на избранных? - PullRequest
6 голосов
/ 04 января 2010

У меня есть следующий класс:

public class Product
{
  public virtual Guid Id { get; set; }
  public virtual string Name { get; set; }
  public virtual Decimal PricePerMonth { get; set; }
  public virtual BillingInterval DefaultBillingInterval { get; set; }
  public virtual string AdditionalInfo { get; set; }
}

и отображение выглядит так:

 <class name="Product" table="Products">
    <id name="Id" column="ProductId">
      <generator class="guid.comb"/>
    </id>
    <property name="Name" column="ProductName" not-null="true" type="String" />
    <property name="PricePerMonth" column="PricePerMonth" not-null="true" type="Decimal" />
    <property name="DefaultBillingInterval" type="int" not-null="true" />
    <property name="AdditionalInfo" type="string" not-null="false" />
</class>

Я использую класс Repository<T> со следующим методом (Session - это свойство, которое возвращает текущий сеанс):

public IEnumerable<T> FindAll(DetachedCriteria criteria)
{
  return criteria.GetExecutableCriteria(Session).List<T>();
}

Теперь, когда я делаю следующее (сеанс - это тот же сеанс, который используется в хранилище):

IEnumerable<ProductDTO> productDTOs = null;
using(ITransaction tx = session.BeginTransaction(IsolationLevel.ReadCommitted))
{
    var products = repository.FindAll(new DetachedCriteria.For<Product>().Add(Restrictions.Like("Name", "Some Product%")));
    productDTOs = ToDTOs(products);
    tx.Commit();
}
// Do stuff with DTO's

Здесь есть оператор commit, потому что я использую сервисный уровень, который автоматически фиксирует каждую транзакцию, если ошибок не было. Я просто свернул свой сервисный слой для упрощения визуализации.

Мой ToDTOs метод просто преобразуется в DTO:

private IEnumerable<ProductDTO> ToDTO(IEnumerable<Product> products)
{
  return products.Select(x => new ProductDTO()
    {
      Id = x.Id,
      Name = x.Name,
      PricePerMonth = x.PricePerMonth,
      AdditionalInfo = x.AdditionalInfo
    }).ToList();
}

Мой журнал nhibernate показывает следующий вывод:

2010-01-04 19:13:11,140 [4] DEBUG NHibernate.SQL - SELECT ... From Products ...
2010-01-04 19:13:11,237 [4] DEBUG NHibernate.SQL - UPDATE Products ...
2010-01-04 19:13:11,548 [4] DEBUG NHibernate.SQL - UPDATE Products ...
...

Поэтому, выбирая продукты, он выдает оператор обновления для каждого продукта, возвращаемого при фиксации сеанса, даже если в продуктах ничего не изменилось.

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 04 января 2010

У меня был этот эффект, только когда у меня была сущность, которая не возвращает то же значение из свойства, которое было присвоено ему. Тогда NH считает его грязным.

Пример:

class Foo
{
  private string name;

  public string Name 
  { 
    // does not return null when null had been set
    get { return name ?? "No Name"; }
    set { name = value; }
  }

}

Так я бы написал файл сопоставления.

<class name="Product" table="Products">
    <id name="Id" column="ProductId">
      <generator class="guid.comb"/>
    </id>
    <property name="Name" column="ProductName" not-null="true" />
    <property name="PricePerMonth" not-null="true" />
    <property name="DefaultBillingInterval" not-null="true" />
    <property name="AdditionalInfo" />
</class>

Вам не нужно указывать типы. Они определяются NHibernate во время выполнения.

1 голос
/ 04 мая 2017

Старая запись, но, возможно, это поможет кому-то в будущем.

У меня есть хранилище данных C # Class Library (Oracle в качестве базы данных). Значение таблицы было NULL, но в моем репо значение было определено как десятичное и должно было быть? Десятичное. Это исправило эту проблему обновления при запуске выбора.

...