Question

Il semble que NHibernate ne peut pas Automap plus d'un IList d'un type donné dans une entité.

Considérons les deux entités suivantes (en fonction du code de l'échantillon Examples.FirstProject qui est inclus dans le code source NHibernate courant).

public class Employee
{
    public virtual int Id { get; private set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
}

public class Store
{
    public virtual int Id { get; private set; }
    public virtual IList<Employee> Staff { get; set; }
    public virtual IList<Employee> Managers { get; set; }
}

Cela semble être un modèle d'objet parfaitement valide -. Chaque magasin a plusieurs employés du personnel et plusieurs employés du gestionnaire

Mais quand j'Automap, les listes du personnel et les gestionnaires sont stockées dans la table des employés, tous avec la même clé étrangère.

Employee Table

Id FirstName LastName Store_id 
3  Daisy     Harrison   1 
4  Jack      Torrance   1 
5  Sue       Walkters   1 
6  Tom       Tommorow   1 
7  Dick      Diggler    1 

Le résultat net est que lorsque les données sont lues en arrière de la base de données, les deux listes du personnel et les gestionnaires sont renseignés avec tous ligne dans la table.

Cela ressemble à un bogue dans AutoMapping pour moi, mais je suis assez nouveau pour NHibernate, sous quelque forme, et ne savent pas bien c'est encore des limites.

Dans tous les cas, Comment puis-je faire NHibernate traiter les deux listes comme distinctes?

Si possible, je vous en serais reconnaissant un fragment de code AutoMapping qui traite directement le code d'exemple que j'ai fourni (par exemple quelque chose comme « mettre cette dérogation exacte dans la section .Mappings de votre CreateSessionFactory »).

Ceci est parce que je suis seulement un peu familier avec AutoMapping, et pas du tout familier avec les anciennes façons de faire les choses, ce qui signifie que je ne peux pas « remplir les blancs » très bien encore.

Mais si vous avez seulement le temps de me diriger dans la bonne direction, ce serait utile aussi.

Voici mon code CreateSessionFactory, pour donner un peu de contexte:

    private static ISessionFactory CreateSessionFactory()
    {
        ISessionFactory sessionFactory = null;

        const string autoMapExportDir = "AutoMapExport";
        if( !Directory.Exists(autoMapExportDir) )
            Directory.CreateDirectory(autoMapExportDir);

        try
        {
            var autoPersistenceModel = 
                AutoMap.AssemblyOf<Product>()
                        .Where(t => t.Namespace == "Examples.FirstProject.Entities")
                        .Conventions.Add( DefaultCascade.All() )
                ;

            sessionFactory = Fluently.Configure()
                .Database(SQLiteConfiguration.Standard
                              .UsingFile(DbFile)
                              .ShowSql()
                         )
                .Mappings(m => m.AutoMappings.Add(autoPersistenceModel)
                                             .ExportTo(autoMapExportDir)
                         )
                .ExposeConfiguration(BuildSchema)
                .BuildSessionFactory()
                ;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

        return sessionFactory;
    }
Était-ce utile?

La solution

Paul Batum a répondu à ma question ici , et a fourni un exemple de travail autonome (cliquez sur le téléchargement bouton après que vous accédez à la page liée).

Le code suivant est copié de sa réponse. Le point clé est dans la classe StoreMap à la fin de la liste, qui met en place une dérogation à une clause Where qui utilise la propriété dans Employee Est gestionnaire.

Notez que (au moins avec v 1.0.0.594.) Il y a une grande chasse aux sorcières avec AutoMapping - la classe de cartographie (par exemple StoreMap) ne peut pas être dans le même espace que la classe de domaine (par exemple magasin)

Dans le cas contraire, NHibernate va lancer "NHibernate.MappingException: (XmlDocument) (2,4): erreur de validation XML: ... ", avec absolument aucune indication de ce que lorsque le problème réel est.

Ceci est probablement un bug qui peut être corrigé dans les versions ultérieures de Fluent NHibernate.

public class Employee 
{ 
    public virtual int Id { get; private set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual bool IsManager { get; set; } 
} 


public class Store 
{ 
    public virtual int Id { get; private set; } 
    public virtual IList<Employee> Staff { get; private set; } 
    public virtual IList<Employee> Managers { get; private set; } 


    public Store() 
    { 
        Staff = new List<Employee>(); 
        Managers = new List<Employee>(); 
    } 


    public void AddManager(Employee employee) 
    { 
        employee.IsManager = true; 
        this.Managers.Add(employee); 
    } 


    public void AddStaff(Employee employee) 
    { 
        this.Staff.Add(employee); 
    } 


} 

Voici le remplacement de la cartographie pour le magasin:

// Must be in different Namespace from class Store!!!
public class StoreMap : IAutoMappingOverride<Store> 
{ 
   public void Override(AutoMapping<Store> mapping) 
   { 
       mapping.HasMany(x => x.Managers) 
           .Cascade.All() 
           .Where("(IsManager = 1)"); 
       mapping.HasMany(x => x.Staff) 
           .Cascade.All() 
           .Where("(IsManager = 0)"); 
   } 
} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top