2017-03-29 1 views
0

Je crée la base de données à partir des mappages. Et j'ai un ReferenceAny qui crée une contrainte qui provoque des problèmes sur les mises à jour d'une table.Pourquoi Nhibernate crée-t-il un FK pour ReferencesAny?

I simplifié le code, mais ce sont mes classes:

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; } 
} 

Ce sont mes correspondances:

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); 
    } 
} 

J'ai reçu le script pour le FK qui est en cours de création:

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

Lorsque j'insère des éléments liés à ClassA, une erreur se produit parfois lorsque l'Id est en conflit avec ClassB.

Pourquoi le FK est-il créé? Est-ce que j'utilise le ReferenceAny faux? Y at-il au moins un moyen de Nhibernate de ne pas créer le FK?

Répondre

1

Silly moi! J'ai juste remarqué que j'avais oublié de dire au HasMany de ne pas créer le FK, j'étais perplexe parce qu'il créait juste un FK, mais bien sûr ils sont en conflit c'est pourquoi je n'en ai qu'un.

Ainsi, la cartographie ClassA et ClassB devrait ressembler à ceci:

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();   
    } 
}