2017-03-29 10 views
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를 만들지 않는 방법이 적어도 있습니까?

답변

1

어리석은! 나는 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();   
    } 
}