7
votes

Nibernate fluide beaucoup à une cartographie

Je suis nouveau pour hiberner le monde. C'est peut-être une question idiote, mais je ne suis pas capable de le résoudre. Je teste beaucoup dans une relation de tables et d'essayer d'insérer un enregistrement. J'ai une table de département et une table des employés. L'employé et le département ont beaucoup à une relation ici. J'utilise couramment NHibernate pour ajouter des enregistrements. Tous les codes ci-dessous. Pls aidez

code SQL strong> p> xxx pré>

Fichiers de classe strong> p>

        try
        {
            Dept dept = new Dept();
            dept.DeptLocation = "Austin";
            dept.DeptName = "Store";

            Employee emp = new Employee();
            emp.EmpName = "Ron";
            emp.EmpAge = 30;

            IList<Employee> empList = new List<Employee>();
            empList.Add(emp);
            dept.Employees = empList;
            emp.Dept = dept;

            IRepository<Dept> rDept = new Repository<Dept>();
            rDept.SaveOrUpdate(dept);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }


1 commentaires

S'il vous plaît vérifier ce lien. Son état de mappage très important. Thanigai.WordPress .COM / 2011/06/23 / ...


3 Réponses :


0
votes

Le problème est (comme le message d'erreur vous dit) que vous n'avez pas de colonne nommée "DEPT_ID". Votre nom de colonne est à la place "Deptid". Les conventions par défaut de NHibernate fluide sont que le nom doit être avec le soulignement. Pour résoudre ce problème, vous pouvez modifier le nom de la colonne de votre base de données ou vous pouvez remplacer la convention dans votre fichier de mappage pour le dire d'utiliser votre nom de colonne. Cela peut être fait de cette manière: xxx


1 commentaires

J'ai fait les changements comme vous l'avez mentionné. Je reçois toujours la même erreur. DéptMapping public () {id (x => x.id); Map (x => x.deptname); Map (x => x.deptlocation); Hasmany (x => x.employes) .keycolumn ("Deptid") .inverse () .cascade.all (); } Emploi emploi public () {id (x => x.id); Carte (x => x.empname); Map (x => x.empage); Carte (x => x.deptide); Références (x => x.dept) .Forignkey ("Deptid") .cascade.none (); }



8
votes

La réponse de Mattias est presque correcte, mais l'élégance fiable est utilisée pour la génération de schéma. Essayez la cartographie ci-dessous à la place. En outre, vous avez la collection des employés mappée avec CascadeAll. Cela supprimera les dossiers des employés si vous supprimez un département, ce qui n'est probablement pas souhaitable.

public class DeptMapping : ClassMap<Dept>
    { 
        public DeptMapping() 
        {
            Id(x => x.Id); 
            Map(x => x.DeptName); 
            Map(x => x.DeptLocation); 
            HasMany(x => x.Employees).KeyColumn("DeptId").Inverse().Cascade.All(); 
        } 
    }

public class EmployeeMapping : ClassMap<Employee>
{ 
    public EmployeeMapping() 
    { 
        Id(x => x.Id); 
        Map(x => x.EmpName); 
        Map(x => x.EmpAge); 
        Map(x => x.DeptId); 
        References(x => x.Dept, "DeptId").Cascade.None(); 
   } 
}


11 commentaires

Jamie, merci pour la correction, je suis capable d'insérer un enregistrement vers la table de département. Mais ce n'est pas insérant des enregistrements à la table des employés. On dirait que mon codage pour appeler sauvedorupdate fait une erreur. Je suis comme presque là, mais pas enfin.


La ligne dept.employes = Emplist; , change la référence de la collection. Vous devez ajouter l'employé à la collection via dept.employes.add (EMP); .


J'ai remplacé dept.employes = Emplist avec dept.employes.add (EMP), il donne une référence d'objet non définie d'instance d'un objet. Ceci est correct car le employeurecoleciton est null. L'employé est une collection IList , il doit être défini avant d'ajouter des articles à cela. Elle ne fonctionnera pas. Deuxième chose, comment la référence de collecte est modifiée avec elle?


Vous devriez initialiser la collection du constructeur de Dept: Employés = nouvelle liste () . En réponse à la deuxième question, NHibernate fournit sa propre mise en œuvre de la collection pour IList, de sorte que lorsque vous avez attribué deptemplages = Emplist La référence a été modifiée de la liste de NHibernate à la vôtre.


Merci de me guider. J'ai mis en œuvre comme vous avez dit. créé un constructeur aux employés. A également ajouté une autre méthode à la classe de département comme addemplé. J'envoie à nouveau la partie du code. Je ne suis toujours pas capable d'ajouter un enregistrement à la table des employés. Il ajoute parfaitement à la table des départs.


Maintenant, je suis capable d'insérer l'enregistrement à l'employé. J'ai besoin d'ajouter un employé après avoir ajouté le département. Il a maintenu les mêmes valeurs de clé étrangère. Je pense que c'est un peu bizarre. Le ministère devrait prendre tout le chemin d'insertion. Je ne sais pas si ce n'est par conception ou besoin de changer de propriété. Le code est ci-dessous. Pls donner votre suggestion. IRÉPOSITOIRE RDEPT = nouveau référentiel (); rdept.saveorupdate (département); IRÉPOSITOIRE REMP = nouveau référentiel (); REMP.SAVEORUPDATED (EMP);


Boss, j'ai la réponse. J'ai fabriqué une erreur en faisant cascade.none () pour Dept.Je l'a changé à Casecade.SaveUpdate (). Cela a fonctionné bien ennemi moi. Merci beaucoup pour me guider.


Pas de problème, je suis content que vous l'avez compris.


Oh mon Dieu! Pourquoi Homtoone s'appelle soudainement "références"? Je veux gifler des auteurs Nibernate couramment pour perdre des heures de mon temps.


Pourquoi inverse () est-il toujours nécessaire? Cela semble juste comme un détail de mise en œuvre interne pour le hardcore. Devrait-il être vraiment nécessaire?


Inverse est nécessaire, voici une bonne explication: Stackoverflow.com/questions/713637 / ...



0
votes
try
{
    Dept dept = new Dept();
    dept.DeptLocation = "Austin";
    dept.DeptName = "Store";

    Employee emp = new Employee();
    emp.EmpName = "Ron";
    emp.EmpAge = 30;


    dept.AddEmployees(emp); 


    IRepository<Dept> rDept = new Repository<Dept>();
    rDept.Add(dept);
}

0 commentaires