У меня есть следующий класс:
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>
Я использую a 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
Оператор фиксации там, потому что я использую уровень служб, который автоматически фиксирует каждую транзакцию, если никакие ошибки не произошли. Я просто свернул свой уровень служб здесь для более легкой визуализации..
Мой 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 ...
...
Таким образом путем выбора продуктов это делает заявление обновления для каждого продукта, возвращенного, когда сессия фиксирует, даже при том, что ничто не было изменено в продуктах..
Какие-либо идеи?
Я имел этот эффект только тогда, когда у меня была сущность, которая не возвращала из собственности того же значения, которое было ей присвоено. Тогда 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 во время выполнения
.