2011-06-26 7 views
1

Je suis nouveau à Entity Framework et par conséquent cette question peut sembler un peu noobish.Entity Framework - Insérer dans des tables connexes

Je vais essayer d'expliquer mon scénario avec l'exemple Département-Employé J'ai deux tables "Département" et "Employé". Le département a une colonne d'identité DeptID. J'essaie de créer un nouveau département et d'y ajouter des employés nouvellement créés en une seule fois. Ci-dessous est mon code:

using (MyDB context = new MyDB()) 
{ 
Department dept = new Department(); 
dept.Name = "My Department"; 

Employee emp = new Employee(); 
emp.Name = "Emp Name"; 
emp.Department = dept; //Tried dept.Employees.Add(emp) also, same result 
context.AddObject("Department", dept); 
context.SaveChanges() 
} 

Mais pour une raison quelconque, l'enregistrement n'est pas inséré. Il génère une erreur dans la deuxième requête d'insertion.

Voici les requêtes:

INSERT INTO Department 
      (Name) 
VALUES  ('Dept1' /* @gp1 */); 
SELECT ID 
FROM Department 
WHERE row_count() > 0 
AND `ID` = last_insert_id() 


-------------------------- 
INSERT INTO Employee 
      (DeptID, 
      Name) 
VALUES  (19, 
      'Name'); /* @gp1 */ 
SELECT id 
FROM Employee 
WHERE row_count() > 0 
AND `id` = last_insert_id() 

L'erreur qu'il jette est à la ligne 4 de la deuxième requête. Donc, je suppose que quelque chose ne va pas avec l'identité. J'utilise MySQL.

Quelqu'un peut-il s'il vous plaît expliquer ce qui pourrait être faux?

EDIT: J'ai modifié le code SQL en fonction de cet exemple. Je ne peux pas donner mes véritables détails de la table.

Répondre

0

Quelle est la structure de vos classes? Je suppose qu'il y a quelque chose qui ne va pas et EF ne construit pas correctement le modèle.

J'ai également eu quelques problèmes avec EF4.1 jusqu'à ce que j'ai défini manuellement la clé. La partie de EF qui «assume» quelle variable est votre clé ne semble pas fonctionner sur certains objets complexes comme les objets dérivés d'une classe de base et échoue également dans d'autres cas.

Voici ce que j'attendre votre code pour ressembler à:

public class Department 
{ 
    [Key] 
    public Int64 DepartmentId { get; set;} 

    public String Name { get; set;} 
} 

public class Employee 
{ 
    [Key] 
    public Int64 EmployeeId { get; set;} 

    public String Name { get; set;} 

    //Adding virtual here allows lazy loading of department 
    public virtual Department Department {get; set;} 
} 


public class MyDatabase : DbContext 
{ 
    DbSet<Department> Departments; 
    DbSet<Employee> Employees; 
} 

J'ai un projet dans son ensemble au travail qui repose sur Entity Framework correctement cartographie ci-dessus dans un grand nombre d'une relation et je l'ai eu pas de problèmes en utilisant le code comme indiqué.

+0

Ok, je suppose que j'aurais dû le mentionner aussi dans mon post original mais je ne l'ai pas fait :(Mon mauvais, j'utilise des entités auto-suivi. vous avez mentionné dans votre code, je ne vois pas l'attribut [Key] dans mon modèle, mais je vois que la clé est correctement définie dans l'edmx (XML) .je pense que je vais essayer un projet séparé avec seulement ces 3 – Vinod

+0

Ok, j'ai compris quel était le problème, j'avais une colonne dans mon tableau sous le nom 'Condition' qui se trouve être un mot-clé dans MySQL :-( – Vinod

0
 'Name' /* @gp1 */ 

manque une parenthèse fermante. Je l'ai ajouté ici.

 'Name') /* @gp1 */ 
+0

Salut, merci de répondre. J'ai oublié de mentionner que le SQL est généré par EF et je l'ai modifié pour convenir à cet exemple. Je ne peux pas donner mes véritables détails de la table. Donc, la parenthèse manquante est totalement mon erreur en affichant la question. Modification du poste maintenant ... – Vinod

+0

il vous manque également deux points-virgules entre les instructions. –

+0

J'utilise le profileur EF pour voir les requêtes générées. Je ne vois pas de point-virgule là-bas ce qui est étrange -___- – Vinod

Questions connexes