J'ai un ClassMap très simple
public class ContentMap : ClassMap<Content>
{
public ContentMap()
{
// Basic property mapping
// Parent property mapping
References(x => x.Category).Column("CategoryId");
}
}
En utilisant cette méthode, mes mappings fonctionnent parfaitement bien et les Category
n'est pas nulle.
Si j'essaie d'ajouter cette ligne en dessous de la première référence
References(x => x.LastActive).Column("LastActiveSubCategoryId");
Mes mappings ne sont pas bons.
Si LastActiveSubCategoryId
est nulle, Category
s'adapte parfaitement. Si elle n'est pas nulle, LastActiveSubCategoryId
sera défini mais alors CategoryId
est nulle.
Les propriétés elles-mêmes sont simples
public virtual Category Category { get; set; }
public virtual SubCategory LastActive { get; set; }
Il n'y a rien de complexe dans le Category
o SubCategory
mappings non plus. Ils ressemblent beaucoup aux ContentMap
classe (avec une seule ligne de référence)
Une idée de ce qui pourrait provoquer ce comportement ? Puis-je utiliser une seule référence ?
Mise à jour
J'ai regardé le SQL et c'est ce qui semble se passer, j'espère que quelqu'un pourra m'aider à comprendre pourquoi.
Le site Content
est insérée dans la base de données sans problème avec l'option CategoryId
y LastActiveSubCategoryId
nul.
Le site Category
est insérée, puis une instruction de mise à jour met à jour l'entité Content
en ne mettant à jour que le CategoryId
et rien d'autre.
S'il n'y avait pas SubCategory
tout serait parfait à ce stade.
S'il existe un SubCategory
puis, quelques déclarations plus tard, il est inséré et ensuite l Category
est mis à jour. Dans la déclaration de mise à jour, plusieurs valeurs différentes sont modifiées (certaines n'ont pas besoin de l'être puisqu'elles n'ont pas changé depuis l'insertion), notamment la valeur CategoryId
y SubCategoryId
. Sauf que maintenant CategoryId
est nulle et LastActiveSubCategoryId
ne l'est pas.
Alors pourquoi CategoryId
sera nulle lors de la mise à jour ?
Mise à jour 2
Le code que j'utilise pour insérer les objets ne sert pour l'instant qu'à des tests de base. Voici les morceaux de code pertinents :
Category category = new Category();
dao.Save(category);
Content content = new Content();
category.AddContent(content); // Adds it to a list, like in the tutorial mBotros posted
dao.Save(Content);
SubCategory subCategory = new SubCategory();
content.AddSubCategory(subCategory);
dao.Save(subCategory);
// On the Content class
public virtual void AddSubCategory(SubCategory subCategory)
{
SubCategories.Add(subCategory);
LastActive = subCategory;
}