NHibernate在映射where子句引用错误表时的多对一过滤器

时间:2014-10-28 16:19:34

标签: nhibernate filter fluent-nhibernate mapping table-per-class

在我的项目结构中,我使用的是每个类的层次结构,我遇到了一个过滤器问题,在某些情况下会查找超类中的属性。当这种情况发生时,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。

我做错了什么,如何解决这个问题?

0 个答案:

没有答案