J'ai une situation dans laquelle une de mes tables est auto-mappée sur elle-même. La clé primaire d'une ligne (Parent) peut être utilisée comme clé étrangère à l'autre ligne (Child) et cette colonne de clé étrangère contient null pour les lignes qui n'ont pas de parent. Quelque chose comme ceci:Récupération d'enregistrements avec une valeur nulle - nhibernate fluide
table: Settings_LocationType
++++++++++++++++++++++++++++++++++++++++++++++++
LocationID | Name | ParentLocationId
++++++++++++++++++++++++++++++++++++++++++++++++
1 Parent 1 null
2 Child 1 1
3 Child 2 1
4 Parent 2 null
Modèle: LocationType
public class LocationType
{
public virtual long LocationTypeId { get; set; }
public virtual string Name { get; set; }
public virtual LocationType ParentLocationType { get; set; }
public virtual IList<LocationType> LocationTypes { get; set; }
public LocationType()
{
LocationTypes = new List<LocationType>();
}
}
Cartographie: LocationTypeMap
public class LocationTypeMap : ClassMap<LocationType>
{
public LocationTypeMap()
{
Table("Setting_LocationType");
Id(x => x.LocationTypeId).Column("LocationId").GeneratedBy.Sequence("location_type_seq");
Map(x => x.ShortName, "Name").Length(15).Not.Nullable();
References<LocationType>(x => x.ParentLocationType).LazyLoad().Nullable();
HasMany<LocationType>(x => x.LocationTypes).AsBag().KeyColumn("ParentLocationId").KeyNullable().LazyLoad().Inverse().Cascade.SaveUpdate();
}
}
Maintenant, j'ai un problème à récupérer les lignes qui contiennent NULL (ou dire ne sont pas enfant) dans le champ PatentLocationType. J'ai essayé passer null comme ça repo.Get("ParentLocationType.LocationTypeId", null);
, mais cela n'a pas fonctionné, mais a jeté object reference is not set to an instance error.
oui je l'ai fait , cela ne fonctionnait pas non plus mais je pense que je sais pourquoi: regardez la requête SQL qu'il génère "SELECT LocationId, Nom, ParentLocationId FROM Settings_LocationType WHERE ParentLocationId = null". Je pense qu'il peut être résolu si certains comment je le fais pour remplacer "= null" par "est nul". Une idée de comment faire cela? – Waqas
ok, je l'ai résolu en utilisant Expression.IsNull au lieu d'Expression.Eq – Waqas