Nhibernate macht Updates bei Select?

Ich habe folgende Klasse:

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; }
}

und das Mapping sieht so aus:

 <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>

Ich benutze einRepository<T> Klasse mit der folgenden Methode (Session ist eine Eigenschaft, die die aktuelle Sitzung zurückgibt):

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

Wenn ich jetzt Folgendes tue (die Sitzung ist dieselbe Sitzung, die im Repository verwendet wird):

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

Die Festschreibungsanweisung ist da, weil ich eine Serviceschicht verwende, die automatisch jede Transaktion festschreibt, wenn keine Fehler aufgetreten sind. Ich habe gerade meine Serviceebene hier reduziert, um die Visualisierung zu vereinfachen.

MeineToDTOs Methode konvertiert einfach in ein 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();
}

Mein nhibernate-Protokoll zeigt die folgende Ausgabe an:

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 ...
...

Durch Auswahl der Produkte wird eine Update-Anweisung für jedes Produkt ausgegeben, das beim Festschreiben der Sitzung zurückgegeben wird, obwohl an den Produkten nichts geändert wurde.

Irgendwelche Ideen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage