У меня есть ситуация, когда один из моих столов сопоставляется сам с собой. Первичный ключ одной строки (Parent) может использоваться как внешний ключ для другой строки (Child), и этот столбец внешнего ключа содержит нуль для таких строк, у которых нет родителя. Примерно так:
table: Settings_LocationType
++++++++++++++++++++++++++++++++++++++++++++++++
LocationID | Name | ParentLocationId
++++++++++++++++++++++++++++++++++++++++++++++++
1 Parent 1 null
2 Child 1 1
3 Child 2 1
4 Parent 2 null
Модель: 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>();
}
}
Отображение: 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();
}
}
Теперь у меня проблема с получением тех строк, которые содержат NULL (или, скажем, не дочерние) в поле PatentLocationType. Я попытался передать NULL, как это repo.Get("ParentLocationType.LocationTypeId", null);
, но это не сработало, но бросил object reference is not set to an instance error.