База данных Entity Framework 6 сначала содержит много разных отношений

c# ef-database-first entity-framework entity-framework-6 many-to-many

Вопрос

Я пытаюсь использовать EF6 и пытаюсь использовать отношения многих и многих.

Сначала использование базы данных - это моя база данных, основанная на скриптах.

CREATE TABLE [States] (
    Id int identity (1, 1) not null primary key,
    Name varchar(50) not null,
    Abbreviation varchar(2) not null
)
GO

CREATE TABLE Departments (
    Id int identity (1, 1) not null primary key,
    Name varchar(50),
)
GO

CREATE TABLE [Role] (
    Id int identity (1, 1) not null primary key,
    Name varchar(50)
)
GO

CREATE TABLE Employees (
    Id int identity (1, 1) not null primary key,
    FirstName varchar(50),
    LastName varchar(50),
    Email varchar(255),
    DepartmentId int constraint fk_Department_Id foreign key references Departments(Id)
)

GO

CREATE TABLE AssignedRoles (
    Id int identity (1, 1) not null primary key,
    EmployeeId int not null constraint fk_Employee_Id foreign key references Employees(Id),
    RoleId int not null constraint fk_Role_Id foreign key references [Role](Id),
)
GO

CREATE TABLE [Addresses] (
    Id int identity (1, 1) not null primary key,
    EmployeeId int not null,
    StreetAddress varchar(255),
    City varchar(55),
    StateId int not null,
    ZipCode varchar(10),
    CONSTRAINT fk_Employee_Id_Address foreign key (EmployeeId) REFERENCES [Employees](Id),
    CONSTRAINT fk_State_Id foreign key (StateId) REFERENCES [States](Id)
)
GO

Мой код:

public MicroOrmComparison.UI.Models.Employee Add(MicroOrmComparison.UI.Models.Employee employee)
{
    var employeeToInsert = AutoMapper.Mapper.Map<MicroOrmComparison.UI.Models.Employee, Employee>(employee);
    using (var db = new EmployeeDb())
    {
        db.Employees.AddOrUpdate(employeeToInsert);
        if (employeeToInsert.Addresses != null)
        {
            foreach (var address in employeeToInsert.Addresses)
            {
                db.Addresses.AddOrUpdate(address);
            }
        }
        if (employeeToInsert.Roles != null)
        {
            foreach (var role in employeeToInsert.Roles)
            {
                role.Employees.Add(employeeToInsert);
                db.Roles.AddOrUpdate(role);
                db.Employees.AddOrUpdate(employeeToInsert);
            }
        }
        db.SaveChanges();
        employee.Id = employeeToInsert.Id;
    }
    return employee;
}

Сгенерированный сотрудник из базы данных EF6

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace EntityFramework.DataLayer
{
    using System;
    using System.Collections.Generic;

    public partial class Employee
    {
        public Employee()
        {
            this.Addresses = new HashSet<Address>();
            this.Roles = new HashSet<Role>();
        }

        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
        public Nullable<int> DepartmentId { get; set; }

        public virtual ICollection<Address> Addresses { get; set; }
        public virtual Department Department { get; set; }
        public virtual ICollection<Role> Roles { get; set; }
    }
}

Сгенерированный код для роли

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace EntityFramework.DataLayer
{
    using System;
    using System.Collections.Generic;

    public partial class Role
    {
        public Role()
        {
            this.Employees = new HashSet<Employee>();
        }

        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Employee> Employees { get; set; }
    }
}

Виновный тест, который терпит неудачу

        [Test]
    public void ShouldAddRolesToUser()
    {
        //Arrange
        var testUserId = InsertUserToBeModified();
        //Act
        var employee = _employeeRepository.GetFullEmployeeInfo(testUserId);
        employee.Roles.Add(new MicroOrmComparison.UI.Models.Role
        {
            Id = 3,
            Name = "Supervisor"
        });
        _employeeRepository.Save(employee);
        //Assert
        var result = _employeeRepository.GetFullEmployeeInfo(testUserId);
        result.Roles.Count().Should().Be(1);
        result.Roles.First().Id.Should().Be(3);
        //Cleanup
        _employeeRepository.Remove(testUserId);
    }

Тест говорит результат. Roles.Count () равен 0.

Моя проблема пытается добавить в таблицу соединений AssignedRoles. Я пробовал несколько вставок внутри foreach внутри блока роли, но все равно не повезло. Я искал в этом сайте, но до сих пор не повезло. Я работаю с Micro ORM, поэтому магия таблицы соединений дует мне в голову. Любая помощь будет принята с благодарностью. У меня есть больше кода, если нужно, просто дайте мне знать, какой код неясно.

Когда я отлаживаю внутри цикла foreach его не добавляя в таблицу соединений. ПОМОГИТЕ

Принятый ответ

EDIT :

У вас отсутствует таблица AssignedRoles . Я добавил .edmx в свой проект, и у меня есть этот объект AssignedRole . Попробуйте воссоздать свой edmx.

Старый ответ (первый код):

Я просто попытался использовать вашу структуру базы данных, и все работает нормально.

EmployeeDbdb = new EmployeeDb();

  var empl = new Employee
        {
            FirstName = "Test",
            LastName = "demo",
            Email = "aa@aaa.com"
        };

        var role = new Role
        {
            Name = "Role1"
        };

        db.Roles.AddOrUpdate(role);

        db.Employees.AddOrUpdate(empl);
        db.SaveChanges();


        db.AssignedRoles.AddOrUpdate(new AssignedRole
        {
            EmployeeId = empl.Id,
            RoleId = role.Id
        });

        db.SaveChanges();

ИЛИ:

EmployeeDbdb = new EmployeeDb();
var empl = new Employee
{
      FirstName = "Test",
      LastName = "demo",
      Email = "aa@aaa.com"
};

var role = new Role
{
    Name = "Role1"
};
db.Roles.AddOrUpdate(role);
db.Employees.AddOrUpdate(empl);
db.AssignedRoles.AddOrUpdate(new AssignedRole
{
      Role = role,
      Employee = empl
});
db.SaveChanges();



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему