为什么Nhibernate为ReferencesAny创建FK?

时间:2017-03-29 15:16:35

标签: c# sql-server nhibernate fluent-nhibernate

我从映射创建数据库。我有一个ReferenceAny正在创建一个约束,导致更新表的问题。

我简化了代码,但这些是我的类:

public interface IInterfaceA
{
    int Id { get; }
}

public class ClassA
{
    public virtual int Id { get; protected set; }
    public virtual IList<ClassC> Items { get; set;  }
}

public class ClassB
{
    public virtual int Id { get; protected set; }
    public virtual IList<ClassC> Items { get; set;  }
}

public class ClassC
{
    public virtual int Id { get; protected set; }
    public virtual IInterfaceA Parent { get; set; }
}

这些是我的映射:

public class ClassAMapping : ClassMap<ClassA>
{
    protected ClassAMapping()
    {
        Id(x => x.Id);
        HasMany(x => x.Items).KeyColumn("parent_id")                
                .Where(string.Format("parent_type = '{0}'", typeof(ClassA).Name))
                .Inverse()
                .Cascade.AllDeleteOrphan();

    }   
}

public class ClassBMapping : ClassMap<ClassB>
{
    protected ClassBMapping()
    {
        Id(x => x.Id);
        HasMany(x => x.Items).KeyColumn("parent_id")                
                .Where(string.Format("parent_type = '{0}'", typeof(ClassB).Name))
                .Inverse()
                .Cascade.AllDeleteOrphan();

    }   
}

public class ClassCMapping : ClassMap<ClassC>
{
    protected ClassCMapping()
    {       
        Id(x => x.Id);
        ReferencesAny(x => x.Parent)
                .IdentityType<int>()
                .MetaType<string>()
                .EntityTypeColumn("parent_type")
                .EntityIdentifierColumn("parent_id")        
            .AddMetaValue<ClassA>(typeof(ClassA).Name)
            .AddMetaValue<ClassB>(typeof(ClassB).Name);
    }   
}

我得到了正在创建的FK的脚本:

ALTER TABLE [dbo].[ClassCTable]  WITH CHECK ADD  CONSTRAINT [FKA72ABA15F7EB0FA9] FOREIGN KEY([parent_id])
REFERENCES [dbo].[ClassBTable] ([Id])

当我插入链接到ClassA的项目时,有时当Id与ClassB冲突时我会收到错误。

为什么要创建FK?我使用ReferenceAny错了吗?至少有一种方法可以让Nhibernate不创建FK吗?

1 个答案:

答案 0 :(得分:1)

傻傻的我!我只是注意到我忘了告诉HasMany不要创建FK,我很困惑,因为它只创建了一个FK,但当然它们是冲突的,这就是为什么我得到一个。

所以ClassA和ClassB映射应如下所示:

remote_tmp = $HOME/.ansible/tmp
local_tmp = $HOME/.ansible/tmp