NHibernate 3.0 beta1 bidirezionale uno-a-molti Impossibile aggiungere oggetto figlio
-
29-09-2019 - |
Domanda
In breve, il problema è che, quando l'oggetto add bambino alla proprietà raccolta dell'oggetto padre senza regolazione esplicita la proprietà parent dell'oggetto bambino, l'inserto fallirà. Facciamo un esempio:
Nota ??strong>:. Sto usando NHibernate 3.0 beta1
Esempio: categoria di prodotto Senario:
(1) dello schema del database:
- Categoria (Id, Name)
- del prodotto (Id, nome, prezzo, CategoryId)
(2) C # Codice in materia di modelli di dominio
public class Category
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual IList<Product> Products { get; private set; }
}
public class Product
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual decimal Price { get; set; }
public virtual Category Category { get; set; }
}
(3) Mapping
<class name="Category" table="Category">
<id name="Id" column="Id">
<generator class="identity" />
</id>
<property name="Name" />
<bag name="Products" inverse="true" cascade="all">
<key column="CategoryId" />
<one-to-many class="Core.Product"/>
</bag>
</class>
<class name="Product" table="Product">
<id name="Id" column="Id">
<generator class="identity" />
</id>
<property name="Name" />
<property name="Price" />
<many-to-one name="Category" column="CategoryId" />
</class>
(4) Chiamare codice
using (var session = sessionFactory.OpenSession())
{
Category category = session.Query<Category>().FirstOrDefault();
Product product = new Product
{
Name = "test",
Price = 50
};
category.Products.Add(product);
// Here, the p.Category is null, but it should NOT be null
// And if now I commit the changes the the database,
// And exception will be thrown: Cann't insert null to column CategoryId
}
Quando viene eseguito il category.Products.Add(product)
, il product.Category
shoule essere oggetto category
! Se io insieme esplicito il product.Category
alla categoria, il commit operazione avrà successo.
Perchè questo? Il bug di NHibernate 3.0 beta1 o altri?
Soluzione
Questo comporta esattamente come documentato.
NHibernate NON impostare product.Category
per voi. Il solito modo per evitare di dimenticare questo è l'aggiunta di un metodo AddProduct
alla categoria che aggiunge il prodotto alla raccolta prodotti e imposta la proprietà Categoria.