0

J'ai une classe appelée travailleurfluent-nhibernate automappage des insertions de clé étrangère null.

public class Worker : BaseEntity 
{ 
    public virtual int WorkerID { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Indemnification> Indemnifications { get; set; } 
} 

public class Indemnification : BaseEntity 
{ 
    public virtual int IndemnificationID { get; set; } 
    public virtual string IndemnificationNumber { get; set; } 
    //another properties 
} 

J'utilise AutoMapping avec quelques conventions

var mappings = new AutoPersistenceModel(); 
       mappings.AddEntityAssembly(typeof(Worker).Assembly).Where(GetAutoMappingFilter); 
     mappings.Conventions.Setup(GetConventions()); 
     mappings.Setup(GetSetup()); 

private Action<IConventionFinder> GetConventions() 
    { 
     return c => 
     { 
      c.Add<PrimaryKeyConvention>(); 
      c.Add<HasManyConvention>(); 
      c.Add<TableNameConvention>(); 
      c.Add<CustomForeignKeyConvention>(); 
      c.Add<SubClassConvention>(); 
     }; 
    } 


    public class PrimaryKeyConvention : IIdConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IIdentityInstance instance) 
     { 
      instance.Column(instance.EntityType.Name + "ID"); 
      instance.UnsavedValue("0"); 
     } 
    } 

    public class HasManyConvention : IHasManyConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IOneToManyCollectionInstance instance) 
     { 
      instance.Key.Column(instance.EntityType.Name + "ID"); 
      instance.Cascade.AllDeleteOrphan(); 
     } 
    } 

    public class TableNameConvention : IClassConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IClassInstance instance) 
     { 
      instance.Table(instance.EntityType.Name); 
     } 
    } 

    public class CustomForeignKeyConvention : ForeignKeyConvention 
    { 
     protected override string GetKeyName(Member property, Type type) 
     { 
      return type.Name + "ID"; 
     } 
    } 

    public class SubClassConvention : IJoinedSubclassConvention 
    { 
     public void Apply(FluentNHibernate.Conventions.Instances.IJoinedSubclassInstance instance) 
     { 
      instance.Table(instance.EntityType.Name); 
      instance.Key.Column(instance.EntityType.BaseType.Name + "ID"); 
     } 

    } 

le problème est quand je sauve des travailleurs avec une liste des Indemnisations: le travailleur est sauvé, et donc les Indemnisations mais la clé étrangère (WorkerID) dans la table d'Indemnisation est nulle ????

+0

est-il question difficile :) ????? –

Répondre

1

Je compris le problème:

lorsque vous devez enregistrer une entité qui a (un à plusieurs) relation, vous devez ouvrir une transaction et commettre :).

Session.BeginTransaction(); 
Session.Save(entity); 
Session.CommitTransaction(); 
0

Didnt vous vous demandez pourquoi le AutoMapping a permis des clés étrangères créées pour un navire relation un à plusieurs à être nulle en premier lieu? Donc, dans votre exemple, pourquoi la colonne "workerId" dans la table "Indemnification" n'a-t-elle pas la contrainte non nulle ajoutée?

Je viens de rencontrer le problème et je pense que même s'il peut être manipulé dans le code, il ne devrait pas du tout être possible d'insérer une valeur nulle, non? Toute solution pour cela?

+0

malheureusement, je ne pouvais pas comprendre la solution, même plus, j'ai essayé de rendre la colonne clé étrangère dans la table Indemnification à ne pas être nul manuellement, et il a fait une exception. –