【问题标题】:nHibernate using the wrong alias in the generated SQLnHibernate 在生成的 SQL 中使用了错误的别名
【发布时间】:2014-04-07 17:28:18
【问题描述】:

当我尝试使用此查询时,nHibernate 抛出 ADOException:

session.Query<Owner>()
    .Where(x => x.Animal.Environments.Any(e => e == "Garage")
        && x.Animal.Name == "Lassie" && x.OwnerName == "John Doe");

生成的 SQL 显示它使用了一个不存在的别名。

这是映射和实体:

    public class Owner
    {
        public Owner()
        {

        }

        public Owner(IAnimalBase animal)
        {
            this.Animal = animal;
        }

        public virtual IAnimalBase Animal { get; protected set; }

        public virtual string OwnerName { get; set; }

        public virtual Guid Id { get; set; }
    }

    public class Dog : AnimalBase
    {
        public virtual string BarkType { get; set; }
    }

    public interface IAnimalBase
    {
        string Name { get; set; }

        IList<string> Environments { get; set; }
        Guid Id { get; set; }
    }

    public abstract class AnimalBase : IAnimalBase
    {
        public virtual Guid Id { get; set; }

        public virtual string Name { get; set; }

        public virtual IList<string> Environments { get; set; }
    }

public class DogMap : SubclassMap<Dog>
{
    public DogMap()
    {
        this.Map(x => x.BarkType);

        this.DiscriminatorValue("D");
    }
}

    public OwnerMap()
    {
        this.Id(x => x.Id).GeneratedBy.GuidComb();

        this.Map(x => x.OwnerName);

        this.References(x => x.Animal).Class<AnimalBase>().Not.LazyLoad().Cascade.All();
    }

    public AnimalBaseMap()
    {
        this.Id(x => x.Id).GeneratedBy.GuidComb();

        this.HasMany(x => x.Environments).Table("AnimalEnvironments").Element("Environment").Cascade.All();

        this.Map(x => x.Name);

        this.DiscriminateSubClassesOnColumn("Aid");
    }

它在抱怨animalbase1_.Id。

select owner0_.Id        as Id2_,
       owner0_.OwnerName as OwnerName2_,
       owner0_.Animal_id as Animal3_2_
from   "Owner" owner0_,
       "AnimalBase" animalbase3_
where  owner0_.Animal_id = animalbase3_.Id
       and (exists (select environmen2_.Environment
                    from   AnimalEnvironments environmen2_
                    where  owner0_.Animal_id = animalbase1_.Id
                           and animalbase1_.Id = environmen2_.AnimalBase_id
                           and environmen2_.Environment = 'Garage' /* @p0 */))
       and animalbase3_.Name = 'Lassie' /* @p1 */
       and owner0_.OwnerName = 'John Doe' /* @p2 */

谢谢!

【问题讨论】:

  • 是使用 QueryOver api 代替一个选项吗?我敢打赌 LINQ 提供程序在这里被破坏了。
  • 你好 Andrew,QueryOver 不是一个选项。

标签: sql c#-4.0 nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

您可能希望映射到实际的类而不是接口。我确信有正当理由使用我从未使用过的界面......

参考:Fluent NHibernate, working with interfaces

未经测试只是一个基本示例

public class Owner
 {
    public Owner()
     {
         Dog = new List<Dog>();
     }
     public virtual IList<Dog> Dog { get; set; }
     public virtual string OwnerName { get; set; }
     public virtual Guid Id { get; set; }
 }

 public class Dog 
 {
     public Dog()
     {
         AnimalBase = new AnimalBase();
     }
     public virtual string BarkType { get; set; }
     public virtual AnimalBase AnimalBase { get; set; }
 }

 public class AnimalBase 
 {
     public AnimalBase()
     {
         Environments = new List<strings>();
     }
     public virtual string Name { get; set; }
     public virtual IList<string> Environments { get; set; }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-20
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多