Entity Framework - вставка в связанные таблицы - PullRequest
1 голос
/ 26 июня 2011

Я новичок в Entity Framework, и, следовательно, этот вопрос может показаться немного дурацким.

Я попытаюсь объяснить свой сценарий на примере отдела-сотрудника. У меня есть две таблицы "Отдел" и "Сотрудник".У отдела есть идентификационный столбец DeptID.Я пытаюсь создать новый отдел и добавить в него вновь созданных сотрудников за один раз.Ниже мой код:

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

Но по какой-то причине запись не вставляется.Он выдает ошибку во втором запросе вставки.

Ниже приведены запросы:

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

Выдаемая ошибка - в строке 4 второго запроса.Так что я предполагаю, что что-то не так с идентичностью.Я использую MySQL.

Может кто-нибудь объяснить, что может быть не так?

РЕДАКТИРОВАТЬ: я изменил SQL для соответствия этому примеру.Я не могу дать свои реальные данные таблицы.

Ответы [ 2 ]

0 голосов
/ 26 июня 2011

Какова структура ваших классов? Я бы предположил, что что-то не так, и EF неправильно строит модель.

Также у меня были некоторые проблемы с EF4.1, пока я не определил ключ вручную. Часть EF, которая «предполагает», какая переменная является вашим ключом, похоже, не работает с некоторыми сложными объектами, такими как объекты, которые являются производными от базового класса, а также не работает в других случаях.

Вот как я мог бы ожидать, что ваш код будет выглядеть так:

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

У меня есть целый проект, который работает на платформе Entity и правильно отображает вышеприведенное в отношение «многие к одному», и у меня не было проблем с использованием кода, как показано.

0 голосов
/ 26 июня 2011
       'Name' /* @gp1 */

отсутствует закрывающая скобка. Я добавил это здесь.

       'Name' ) /* @gp1 */
...