2017-03-29 16 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を間違って使用していますか?少なくともFHを作成しないようにNhibernateする方法はありますか?

答えて

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();   
    } 
} 
関連する問題