NHibernate - 自引用映射会干扰外键映射

时间:2014-05-09 09:47:21

标签: nhibernate fluent-nhibernate

我有以下课程:

public class Track
{
    public virtual int Id { get; set; }
    public virtual Track MainMix { get; set; }
    public virtual IEnumerable<Track> SubMixes { get; set; }
    public virtual IList<FileVersion> Files { get; set; }
}

public class FileVersion
{
    public virtual int Id { get; set; }
    public virtual Track Track { get; set; }        
}

以下映射:

public class TrackMap : ClassMap<Track>
{
    public TrackMap()
    {
        Id(x=>x.Id);
        References(x => x.MainMix);
        HasMany(x => x.SubMixes)
            .Inverse()
            .Cascade.All()
            .KeyColumn("MainMix_id");    
        HasMany(a => a.Files)
            .Access.CamelCaseField(Prefix.Underscore)
            .Cascade.All();        
    }
}

public class FileVersionMap : ClassMap<FileVersion>
{
    public FileVersionMap()
    {
        Id(x => x.Id);
        References(x => x.Track);
    }
}

为简单起见,省略了代码。 Track表有一个&#34; MainMix_id&#34;列,它是Track记录中父/子关系的自引用列。 当我尝试从数据库中获取一个轨道时,NHProfiler告诉我Nhibernate尝试使用以下查询来获取该轨道的文件转换:

SELECT files0_.MainMix_id as MainMix9_1_,
       files0_.Id         as Id1_,
       files0_.Id         as Id9_0_,
       files0_.Track_id   as Track8_9_0_
FROM   [FileVersion] files0_
WHERE  files0_.MainMix_id = 3 /* @p0 */

似乎它已将Track表的父ID列与其主键列混淆。当我从Track映射中删除引用(x =&gt; x.MainMix)时,查询是正确的,但我没有返回父跟踪记录。

如果我能够澄清这一点,请告诉我,并提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这会有所作为吗?

TrackMap:

References(x => x.MainMix).Column("MainMix_id");

FileVersionMap:

References(x => x.Track).Column("Track_id");