I am having the same issue. Above example did not work for me. I have created a simple model below:
public abstract class HasName
{
public string Name { get; set; }
}
public abstract class HasCity : HasName
{
public int CityID { get; set; }
private City _city;
public City City { get { return _city; } set{_city = value;} }
}
public class Cat : HasCity
{
public int CatID { get; set; }
}
public class Dog : HasCity
{
public int DogID { get; set; }
}
public class City : HasName
{
public int CityID { get; set; }
}
And mapping:
protected override IList<
MappingConfiguration
> PrepareMapping()
{
List<
MappingConfiguration
> mappingConfigurations = new List<
MappingConfiguration
>();
MappingConfiguration<
HasName
> beingConfiguration = new MappingConfiguration<
HasName
>();
beingConfiguration.MapType().Inheritance(Telerik.OpenAccess.InheritanceStrategy.Horizontal);
mappingConfigurations.Add(beingConfiguration);
MappingConfiguration<
HasCity
> livesInACityConfig = new MappingConfiguration<
HasCity
>();
livesInACityConfig.MapType().Inheritance(Telerik.OpenAccess.InheritanceStrategy.Horizontal);
mappingConfigurations.Add(livesInACityConfig);
MappingConfiguration<
City
> cityConfiguration = new MappingConfiguration<
City
>();
cityConfiguration.MapType().WithConcurencyControl(OptimisticConcurrencyControlStrategy.Changed).ToTable("City");
cityConfiguration.HasProperty(x => x.CityID).IsIdentity(KeyGenerator.Autoinc).WithDataAccessKind(DataAccessKind.ReadWrite).ToColumn("CityID").IsNotNullable().HasColumnType("int").HasPrecision(0).HasScale(0);
mappingConfigurations.Add(cityConfiguration);
MappingConfiguration<
Dog
> dogConfiguration = new MappingConfiguration<
Dog
>();
dogConfiguration.MapType().ToTable("Dog");
dogConfiguration.HasProperty(x => x.DogID).IsIdentity(KeyGenerator.Autoinc).WithDataAccessKind(DataAccessKind.ReadWrite).ToColumn("DogID").IsNotNullable().HasColumnType("int").HasPrecision(0).HasScale(0);
dogConfiguration.HasAssociation(x => x.City).HasFieldName("HasCity._city").ToColumn("CityID");
mappingConfigurations.Add(dogConfiguration);
MappingConfiguration<
Cat
> catConfiguration = new MappingConfiguration<
Cat
>();
catConfiguration.MapType().WithConcurencyControl(OptimisticConcurrencyControlStrategy.Changed).ToTable("Cat");
catConfiguration.HasProperty(x => x.CatID).IsIdentity(KeyGenerator.Autoinc).WithDataAccessKind(DataAccessKind.ReadWrite).ToColumn("CatID").IsNotNullable().HasColumnType("int").HasPrecision(0).HasScale(0);
catConfiguration.HasAssociation(x => x.City).HasFieldName("HasCity._city").ToColumn("CityID");
mappingConfigurations.Add(catConfiguration);
return mappingConfigurations;
}
Below sample code throws null reference exception when dog.City.Name is called
FluentModel mod = new FluentModel();
City cit = new City();
cit.Name = "test city";
mod.Add(cit);
mod.SaveChanges();
Dog dog = new Dog();
dog.Name = "test dog";
dog.CityID = 1;
mod.Add(dog);
mod.SaveChanges();
FluentModel mod2 = new FluentModel();
foreach (var ct in mod2.Cities)
{
Console.WriteLine(ct.CityID + " - " + ct.Name);
}
foreach (var dg in mod2.Dogs)
{
Console.WriteLine(dg.DogID + " - " + dg.Name + " - " + dg.CityID);
//dg.CityID = 1 and there is a city with ID = 1
Console.WriteLine(dg.City.Name);
//but this throws null reference exception as dg.City is null
}
I am using the latest version.