Сопоставление двух объектов друг с другом

#c# #asp.net #entity-framework

#c# #asp.net #entity-framework

Вопрос:

Я работаю над проектом библиотеки, у меня есть таблица базы Employees данных, которая имеет несколько столбцов, таких как ManagerId и EmployeeId . Я хотел бы сопоставить ManagerId с an EmployeeId .

Итак, идея заключается в том, что если есть сотрудник по имени «Макс» и менеджер по имени «Боб», я бы хотел, чтобы у Max был идентификатор Bobs, чтобы показать, что менеджером Max является Боб.

Надеюсь, я понял… Я пытаюсь выяснить, как я могу решить эту проблему.

EmployeeController:

 public ActionResult Create()
{
    ViewBag.Employees = new SelectList(db.Category, "Id", "Employees");
    return View();
}

// POST: Employees/Create
// To protect from overposting attacks, enable the specific properties you want to bind to, for 
// more details see https://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,FirstName,LastName,Salary,IsCEO,IsManager,ManagerId")] Employees employees)
{
        if (ModelState.IsValid)
        {
            //Checks if there is a ceo
            var ceo = db.Employees.FirstOrDefault(x => x.IsCEO == employees.IsCEO);
            if (ceo == null)
            {
                db.Employees.Add(employees);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            else
            {
                // Informing the user about the problem
                ViewBag.ErrorMessage3 = "There is already a CEO in the database! You cannot create a second one!";
            }
        }

        return View(employees);
}
  

Надеюсь, я проясняю себя, пожалуйста, дайте мне знать, если я должен отредактировать вопрос, чтобы сделать его более понятным.

С уважением

картинка для Адриана

Комментарии:

1. Почему бы просто не добавить внешний ключ в класс Employee, который является Int, равным идентификатору менеджера?

2. @MathewHD не могли бы вы быть более конкретными и привести пример кода, пожалуйста?

3. Почему вы публикуете логику контроллера MVC в вопросе о EF и как настроить объекты? Вы даже не показали фактическую сущность, которую обсуждаете.

4. @JanAdam Я добавил ответ, который должен помочь вам в правильном направлении

Ответ №1:

Если вы хотите, чтобы у каждого Employee из них был менеджер, вам нужно будет добавить a Foreign Key в Employee класс.

Класс Employee:

 public class Employee
{
    [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] // For autoincrement
    public int EmployeeId { get; set; }
    [Required]
    [Index]
    public int ManagerId { get; set; } // Manager ID Foreign Key
    [Required]

    // Add other Database Values here
}
  

Если вы хотите добавить новый Employee объект now, вам нужно сначала попросить менеджера вставить его в Employee .

Вы могли бы, например, получить менеджер с его именем или что-то подобное

Получение менеджера с именем:

 int mID = 0;
string mName = "Test";

using(ForumDbContext context = new ForumDbContext())
{
    foreach(Manager manager in context.Managers
        .SqlQuery("SELECT * FROM Managers WHERE Name = '"   mName   "'").ToList<Manager>())
    {
        mID = manager.M_ID;
    }
}
  

Теперь мы можем использовать это mID , что мы только что получили, чтобы создать нового сотрудника с соответствующим менеджером, которого мы только что искали.

Создание нового сотрудника:

 Employee empl = new Employee
{
    ManagerId = mID,
    // Add other Database Values here
};

using(var context = new ForumDbContext())
{
    context.Employees.Add(empl);
    context.SaveChanges();
}
  

Комментарии:

1. Большое спасибо за ваш ответ! Куда я должен поместить ваш код в «Получение менеджера с именем» и создание нового сотрудника? Я просто не знаю, куда их поместить

2. Нет проблем, вам нужно добавить его в ту часть, где вы создаете новых сотрудников, обязательно обратитесь к менеджеру перед созданием нового сотрудника.

3. Итак, в Create.csshtml? Или это должно быть в EmployeeController?

4. Трудно сказать, как вы создаете новых сотрудников?

5. Это произошло! Еще раз спасибо!

Ответ №2:

Вам нужно ссылаться на сотрудников с помощью forengkeys

Прежде всего:

  1. Сотрудники и менеджеры являются сотрудниками, поэтому вам просто нужна одна DB-таблица
  2. Для ссылки пользователя на другого пользователя (менеджера сотрудника) вам нужна таблица, содержащая идентификаторы
  3. Чтобы сделать это правильно и добиться хорошей производительности, вам нужно будет сослаться на идентификатор из таблицы employee (пункт 1) на manager-foreignkey и на employee-foreignkey (пункт 2)

Если вы никогда не слышали об этом, возможно, это звучит странно и непонятно. Вот пример базы данных и некоторые тестовые данные. Дайте мне знать, если у вас есть какие-либо вопросы

 DROP DATABASE IF EXISTS myDatabase;
CREATE DATABASE myDatabase character set UTF8mb4 collate utf8mb4_bin;
USE myDatabase;

create table `Employees`(
ID int AUTO_INCREMENT PRIMARY KEY NOT NULL, 
`name` varchar(20) not null,
`surname` varchar(20) not null,       
created_at timestamp default current_timestamp,
last_modifed timestamp on UPDATE current_timestamp default current_timestamp
);

create table `EmployeeManager`(
ID int AUTO_INCREMENT PRIMARY KEY NOT NULL,    
FK_Manager int not null,
FK_Employee int not null,
created_at timestamp default current_timestamp,
last_modifed timestamp on UPDATE current_timestamp default current_timestamp
);

ALTER TABLE `EmployeeManager` ADD FOREIGN KEY (FK_Manager) REFERENCES `Employees`(ID);
ALTER TABLE `EmployeeManager` ADD FOREIGN KEY (FK_Employee) REFERENCES `Employees`(ID);

INSERT INTO `Employees` (`name`, `surname`)  VALUES ('Max', 'Muller');
INSERT INTO `Employees` (`name`, `surname`)  VALUES ('Bob', 'Smith');

INSERT INTO `EmployeeManager` (`FK_Manager`, `FK_Employee`)  
VALUES (
    (SELECT ID FROM `Employees` WHERE `name` = 'Bob' AND `surname` = 'Smith'),
    (SELECT ID FROM `Employees` WHERE `name` = 'Max' AND `surname` = 'Muller'));
  

Комментарии:

1. Но у меня уже есть база данных с именем LibraryDb, и в этой базе данных у меня есть таблица с именем Employees . Почему я должен создавать новую таблицу employees? Могу ли я решить эту проблему без перепроектирования базы данных?

2. Вы можете использовать свою базу данных, но, на мой взгляд, ваша база данных имеет неправильную структуру… Вы можете добавить новую таблицу EmployeeManager для хранения идентификаторов или показать мне свою структуру базы данных, и я попытаюсь что-нибудь придумать

3. @JanAdam Вам не нужно создавать новую базу данных. Просто удалите свою Employee и свою Manager таблицу и добавьте таблицы из моего ответа (игнорируйте создание новой базы данных). Я думаю, это было бы лучшим решением.

4. Хорошо, я отредактировал свой вопрос и добавил картинку для вас. Пожалуйста, посмотрите на картинку выше.

5. @AdrianEfford Он использует Entity Framework, поэтому этот ответ не имеет большого смысла.