为什么 Nhibernate 为 ReferencesAny 创建 FK?
Why is Nhibernate creating a FK for a ReferencesAny?
我从映射创建数据库。我有一个 ReferenceAny 正在创建一个约束,该约束会导致 table.
的更新出现问题
我简化了代码,但这些是我的 类:
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 的方法吗?
傻我!我只是注意到我忘了告诉 HasMany 不要创建 FK,我很困惑,因为它只创建了一个 FK,但当然它们是冲突的,这就是为什么我只得到一个。
所以 ClassA 和 ClassB 映射应该如下所示:
public class ClassAMapping : ClassMap<ClassA>
{
protected ClassAMapping()
{
Id(x => x.Id);
HasMany(x => x.Items).ForeignKeyConstraintName("none").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).ForeignKeyConstraintName("none").KeyColumn("parent_id")
.Where(string.Format("parent_type = '{0}'", typeof(ClassB).Name))
.Inverse()
.Cascade.AllDeleteOrphan();
}
}
我从映射创建数据库。我有一个 ReferenceAny 正在创建一个约束,该约束会导致 table.
的更新出现问题我简化了代码,但这些是我的 类:
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 的方法吗?
傻我!我只是注意到我忘了告诉 HasMany 不要创建 FK,我很困惑,因为它只创建了一个 FK,但当然它们是冲突的,这就是为什么我只得到一个。
所以 ClassA 和 ClassB 映射应该如下所示:
public class ClassAMapping : ClassMap<ClassA>
{
protected ClassAMapping()
{
Id(x => x.Id);
HasMany(x => x.Items).ForeignKeyConstraintName("none").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).ForeignKeyConstraintName("none").KeyColumn("parent_id")
.Where(string.Format("parent_type = '{0}'", typeof(ClassB).Name))
.Inverse()
.Cascade.AllDeleteOrphan();
}
}