在我的项目结构中,我使用的是每个类的层次结构,我遇到了一个过滤器问题,在某些情况下会查找超类中的属性。当这种情况发生时,NHibernate生成的sql使用错误的别名来查找属性。在数据库中,该列位于父表中,但使用的别名用于子表。
简单的结构:
public class Animal
{
public virtual int Id { get; set; }
public virtual Owner Owner { get; set; }
public virtual string Name { get; set; }
}
public class Dog: Animal
{
public virtual string Color { get; set; }
}
public class Owner
{
public virtual int Id { get; set; }
public IList<Dog> Dogs { get; set; }
}
public class AnimalMap: ClassMap<Animal>
{
public AnimalMap(){
Table("Animals");
Id(x => x.Id);
References(x => x.Owner, "OwnerId");
Map(x => x.Name);
}
}
public class DogMap: SubClassmap<Dog>
{
public DogMap(){
Table("Dogs");
Map(x => x.Color);
}
}
public class OwnerMap: ClassMap<Owner>
{
public AnimalMap(){
Table("Animals");
Id(x => x.Id);
HasMany(x => x.Dogs)
.ApplyFilter<AnimalNameFilter>()
.AsBag();
}
}
public class AnimalNameFilter: FilterDefinition
{
public const string FilterName = "AnimalNameFilter";
public IsAllowedFilter()
{
// stored function from the database
WithName(FilterName)
.WithCondition("dbo.IsAnimalNameValid(Name) = 1");
}
}
在此示例中,问题是我的查询将在表Animal和Dogs之间生成连接,但过滤器将尝试在表Dogs而不是Animals中查找列Name。
我做错了什么,如何解决这个问题?