0
매핑에서 데이터베이스를 만듭니다. 그리고 테이블의 업데이트에 문제를 일으키는 제약 조건을 만드는 ReferenceAny가 있습니다. Nhibernate가 ReferencesAny에 대해 FK를 만드는 이유는 무엇입니까?
내가 코드를 단순화하지만, 이러한 내 클래스입니다 :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를 만들지 않는 방법이 적어도 있습니까?