Ho la seguente classe:Nibire eseguire gli aggiornamenti su select?
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; }
}
e la mappatura si presenta così:
<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>
Io uso una classe Repository<T>
con il seguente metodo (Session
è una proprietà che restituisce la sessione corrente):
public IEnumerable<T> FindAll(DetachedCriteria criteria)
{
return criteria.GetExecutableCriteria(Session).List<T>();
}
Ora quando eseguo quanto segue (la sessione è la stessa sessione utilizzata nel repository):
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
Il commettere affermazione è lì, perché io uso un livello di servizio che impegna automaticamente ogni transazione se non errori durante. Ho appena crollato il mio livello di servizio qui per una più facile visualizzazione ..
Il mio metodo ToDTOs
converte semplicemente un 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();
}
mio registro NHibernate mostra il seguente output:
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 ...
...
Così selezionando i prodotti emette una dichiarazione di aggiornamento per ogni prodotto restituito quando la sessione si impegna, anche se nulla è stato modificato nei prodotti.
Qualche idea?
Questo * veramente * come viene implementato l'entità? Non ti credo –
È ... È vero, avevo una lista di ordini a cui era collegato il prodotto, ma ho rimosso questa lista, sia dalla classe che dalla mappatura (come mostrato qui) ed è lo stesso risultato .. La mia confusione è ancora più profonda dal fatto che ciò non accade alle altre mie entità .. –