C# 在ASP.NET中从一个表映射两个实体

C# 在ASP.NET中从一个表映射两个实体,c#,asp.net,asp.net-core,C#,Asp.net,Asp.net Core,我在一个图书馆管理网站上工作。作为应用程序的用户,我希望能够创建新员工,例如ceo、经理和正式员工。我已经做到了这一点,它正在发挥作用 但我希望员工能够根据各自的角色相互管理,例如,我希望: 首席执行官负责管理经理而非员工 经理管理其他经理和员工 没有人能管理首席执行官 为此,我尝试将managerID映射到员工id(我不知道这是否是个好主意): 这就是我的员工控制员的样子: @model LibraryProject.Employees @{ ViewBag.Title = &quo

我在一个图书馆管理网站上工作。作为应用程序的用户,我希望能够创建新员工,例如ceo、经理和正式员工。我已经做到了这一点,它正在发挥作用

但我希望员工能够根据各自的角色相互管理,例如,我希望:

  • 首席执行官负责管理经理而非员工
  • 经理管理其他经理和员工
  • 没有人能管理首席执行官
  • 为此,我尝试将
    managerID
    映射到员工id(我不知道这是否是个好主意):

    这就是我的员工控制员的样子:

    @model LibraryProject.Employees
    
    @{
        ViewBag.Title = "Create";
    }
    
    <h2>Create</h2>
    
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
    
    <div class="form-horizontal">
        <h4>Employees</h4>
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    
        <div class="form-group">
            @Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })
            </div>
        </div>
    
        <div class="form-group">
            @Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })
            </div>
        </div>
    
        <div class="form-group">
            @Html.LabelFor(model => model.Salary, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Salary, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.Salary, "Your input should be an integer between 1-10.", new { @class = "text-danger" })
            </div>
        </div>
    
        <div class="form-group">
            @Html.LabelFor(model => model.IsCEO, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <div class="checkbox">
                    @Html.EditorFor(model => model.IsCEO)
                    @Html.ValidationMessageFor(model => model.IsCEO, "", new { @class = "text-danger" })
                </div>
            </div>
        </div>
    
        <div class="form-group">
            @Html.LabelFor(model => model.IsManager, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                <div class="checkbox">
                    @Html.EditorFor(model => model.IsManager)
                    @Html.ValidationMessageFor(model => model.IsManager, "", new { @class = "text-danger" })
                </div>
            </div>
        </div>
    
        <div class="form-group">
            @Html.LabelFor(model => model.ManagerId, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.ManagerId, new { htmlAttributes = new { @class = "form-control" } })
                @Html.ValidationMessageFor(model => model.ManagerId, "", new { @class = "text-danger" })
            </div>
        </div>
    
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
    }
    
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>
    
    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
    }
    
    @using (Html.BeginForm())
    {
        if (!string.IsNullOrEmpty(ViewBag.ErrorMessage5))
        {
            <div>
                <p>
    
                    <span style="color:red;">@ViewBag.ErrorMessage5</span>
    
                </p>
            </div>
        }
        <div class="form-horizontal" />
    }
    
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Linq;
    using System.Net;
    using System.Web;
    using System.Web.Mvc;
    using LibraryProject;
    
    namespace LibraryProject.Controllers
    {
        public class EmployeesController : Controller
        {
            private LibraryDbEntities db = new LibraryDbEntities();
    
            // GET: Employees
            public ActionResult Index()
            {
                // Linq queries to show all the employees separately, is used to not mixed them up.
                var getCeo = from employeCEO in db.Employees 
                             where employeCEO.IsCEO == true 
                             select employeCEO;
              
                var getEmployee = from employee in db.Employees 
                                  where employee.IsCEO == false && employee.IsManager == false  
                                  select employee;
               
                var getManager = from employeeManager in db.Employees 
                                 where employeeManager.IsManager == true && employeeManager.IsCEO == false  
                                 select employeeManager;
    
                IEnumerable<Employees> list = getCeo.Concat(getEmployee).Concat(getManager);
               
                return View(list.ToList());
            }
    
            public ActionResult CEO()
            {
               // linq query used to display ceo in a separate view
                var getCeo = from employeCEO in db.Employees  
                             where employeCEO.IsCEO == true 
                             select employeCEO;
                return View(getCeo);
            }
    
            public ActionResult TheManager()
            {
                // linq query used to display manager in a separate view
                var getManager = from employeeManager in db.Employees 
                                 where employeeManager.IsManager == true && employeeManager.IsCEO == false 
                                 select employeeManager;
                return View(getManager);
            }
    
            public ActionResult RegularEmployee()
            {
                // linq query used to display employee in a separate view
                var getEmployee = from employee in db.Employees 
                                  where employee.IsCEO == false && employee.IsManager == false 
                                  select employee;
                return View(getEmployee);
            }
    
            // GET: Employees/Details/5
            public ActionResult Details(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Employees employees = db.Employees.Find(id);
    
                if (employees == null)
                {
                    return HttpNotFound();
                }
    
                return View(employees);
            }
    
            // GET: Employees/Create
            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)
                {
                    //salary coefficient for the employees
                    decimal salaryCeo = 2.725M;
                    decimal salaryManager = 1.725M;
                    decimal employeeSalary = 1.125M;
    
                    var ceo = db.Employees.Count(x => x.IsCEO == true);
    
                    //Checks if there is a ceo
                    if (ceo == 0)
                    {
                        employees.Salary = employees.Salary * salaryCeo; // calculate ceo salary
    
                        db.Employees.Add(employees);
                        db.SaveChanges();
    
                        return RedirectToAction("Index");
                    } 
                    else if (ceo == 1 && employees.IsCEO == true) // check if there is a ceo, if yes show errormessage
                    {
                        ViewBag.ErrorMessage5 = "There is already a CEO in the database! You cannot create a second one!";
                    } 
                    else if(employees.IsCEO == false && employees.IsManager == false) // check if the employee is ceo or manager, if false its a regular employee
                    {
                        employees.Salary = employees.Salary * employeeSalary; // calculate regular employees salary
                        db.Employees.Add(employees);
                        db.SaveChanges();
                        return RedirectToAction("Index");
                    }
                    else if (employees.IsCEO == false && employees.IsManager == true) // manager
                    {
                        employees.Salary = employees.Salary * salaryManager; // manager salary
                        db.Employees.Add(employees);
                        db.SaveChanges();
                        return RedirectToAction("Index");
                    }
                }
    
                return View(employees);
            }
    
            // GET: Employees/Edit/5
            public ActionResult Edit(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Employees employees = db.Employees.Find(id);
    
                if (employees == null)
                {
                    return HttpNotFound();
                }
    
                return View(employees);
            }
    
            // POST: Employees/Edit/5
            // 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 Edit([Bind(Include = "Id,FirstName,LastName,Salary,IsCEO,IsManager,ManagerId")] Employees employees)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(employees).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(employees);
            }
    
            // GET: Employees/Delete/5
            public ActionResult Delete(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Employees employees = db.Employees.Find(id);
    
                if (employees == null)
                {
                    return HttpNotFound();
                }
    
                return View(employees);
            }
    
            // POST: Employees/Delete/5
            [HttpPost, ActionName("Delete")]
            [ValidateAntiForgeryToken]
            public ActionResult DeleteConfirmed(int id)
            {
                Employees employees = db.Employees.Find(id);
                db.Employees.Remove(employees);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
    
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    db.Dispose();
                }
                base.Dispose(disposing);
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用系统数据;
    使用System.Data.Entity;
    使用System.Linq;
    Net系统;
    使用System.Web;
    使用System.Web.Mvc;
    利用图书馆项目;
    命名空间LibraryProject.Controllers
    {
    公共类EmployeesController:控制器
    {
    私有LibraryDbEntities db=新的LibraryDbEntities();
    //获取:员工
    公共行动结果索引()
    {
    //Linq查询单独显示所有员工,用于不混淆他们。
    var getCeo=来自db.Employees中的Employeeceo
    其中employeCEO.IsCEO==true
    选择employeeceo;
    var getEmployee=来自db.Employees中的雇员
    其中employee.IsCEO==false&&employee.IsManager==false
    选择员工;
    var getManager=来自数据库employeeManager.Employees
    其中employeeManager.IsManager==true&&employeeManager.IsCEO==false
    选择员工经理;
    IEnumerable list=getCeo.Concat(getEmployee.Concat(getManager);
    返回视图(list.ToList());
    }
    公共行动结果首席执行官()
    {
    //用于在单独视图中显示ceo的linq查询
    var getCeo=来自db.Employees中的Employeeceo
    其中employeCEO.IsCEO==true
    选择employeeceo;
    返回视图(getCeo);
    }
    公共行动结果经理()
    {
    //用于在单独视图中显示管理器的linq查询
    var getManager=来自数据库employeeManager.Employees
    其中employeeManager.IsManager==true&&employeeManager.IsCEO==false
    选择员工经理;
    返回视图(getManager);
    }
    公共行动结果正规员工()
    {
    //用于在单独视图中显示员工的linq查询
    var getEmployee=来自db.Employees中的雇员
    其中employee.IsCEO==false&&employee.IsManager==false
    选择员工;
    返回视图(getEmployee);
    }
    //获取:员工/详细信息/5
    公共行动结果详细信息(int?id)
    {
    if(id==null)
    {
    返回新的HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Employees=db.Employees.Find(id);
    if(employees==null)
    {
    返回HttpNotFound();
    }
    返回视图(员工);
    }
    //获取:员工/创建
    公共操作结果创建()
    {
    ViewBag.Employees=新的选择列表(db.Category,“Id”,“Employees”);
    返回视图();
    }
    //职位:员工/创建
    //若要防止套印攻击,请启用要绑定到的特定属性,例如
    //更多详细信息请参见https://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    公共操作结果创建([Bind(Include=“Id,FirstName,LastName,Salary,IsCEO,IsManager,ManagerId”)]Employees)
    {
    if(ModelState.IsValid)
    {
    //员工工资系数
    十进制工资CEO=2.725M;
    十进制工资经理=1.725M;
    十进制员工工资=1.125米;
    var ceo=db.Employees.Count(x=>x.IsCEO==true);
    //检查是否有ceo
    如果(ceo==0)
    {
    employees.Salary=employees.Salary*salaryCeo;//计算ceo薪资
    db.Employees.Add(员工);
    db.SaveChanges();
    返回操作(“索引”);
    } 
    else if(ceo==1&&employees.IsCEO==true)//检查是否有ceo,如果是,则显示错误消息
    {
    ViewBag.ErrorMessage5=“数据库中已经有一个CEO!您不能创建第二个!”;
    } 
    else if(employees.IsCEO==false&&employees.IsManager==false)//检查该员工是否为ceo或经理,如果为false,则检查其是否为普通员工
    {
    employees.Salary=employees.Salary*employeeSalary;//计算普通员工工资
    db.Employees.Add(员工);
    db.SaveChanges();
    返回操作(“索引”);
    }
    else if(employees.IsCEO==false&&employees.IsManager==true)//manager
    {
    employees.Salary=employees.Salary*salaryManager;//经理薪资
    db.Employees.Add(员工);
    db.SaveChanges();
    返回操作(“索引”);
    }
    }
    返回视图(员工);
    }
    //获取:雇员/编辑/5
    公共行动结果编辑(int?id)
    {
    if(id==null)
    {
    
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Data.Entity;
    using System.Linq;
    using System.Net;
    using System.Web;
    using System.Web.Mvc;
    using LibraryProject;
    
    namespace LibraryProject.Controllers
    {
        public class EmployeesController : Controller
        {
            private LibraryDbEntities db = new LibraryDbEntities();
    
            // GET: Employees
            public ActionResult Index()
            {
                // Linq queries to show all the employees separately, is used to not mixed them up.
                var getCeo = from employeCEO in db.Employees 
                             where employeCEO.IsCEO == true 
                             select employeCEO;
              
                var getEmployee = from employee in db.Employees 
                                  where employee.IsCEO == false && employee.IsManager == false  
                                  select employee;
               
                var getManager = from employeeManager in db.Employees 
                                 where employeeManager.IsManager == true && employeeManager.IsCEO == false  
                                 select employeeManager;
    
                IEnumerable<Employees> list = getCeo.Concat(getEmployee).Concat(getManager);
               
                return View(list.ToList());
            }
    
            public ActionResult CEO()
            {
               // linq query used to display ceo in a separate view
                var getCeo = from employeCEO in db.Employees  
                             where employeCEO.IsCEO == true 
                             select employeCEO;
                return View(getCeo);
            }
    
            public ActionResult TheManager()
            {
                // linq query used to display manager in a separate view
                var getManager = from employeeManager in db.Employees 
                                 where employeeManager.IsManager == true && employeeManager.IsCEO == false 
                                 select employeeManager;
                return View(getManager);
            }
    
            public ActionResult RegularEmployee()
            {
                // linq query used to display employee in a separate view
                var getEmployee = from employee in db.Employees 
                                  where employee.IsCEO == false && employee.IsManager == false 
                                  select employee;
                return View(getEmployee);
            }
    
            // GET: Employees/Details/5
            public ActionResult Details(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Employees employees = db.Employees.Find(id);
    
                if (employees == null)
                {
                    return HttpNotFound();
                }
    
                return View(employees);
            }
    
            // GET: Employees/Create
            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)
                {
                    //salary coefficient for the employees
                    decimal salaryCeo = 2.725M;
                    decimal salaryManager = 1.725M;
                    decimal employeeSalary = 1.125M;
    
                    var ceo = db.Employees.Count(x => x.IsCEO == true);
    
                    //Checks if there is a ceo
                    if (ceo == 0)
                    {
                        employees.Salary = employees.Salary * salaryCeo; // calculate ceo salary
    
                        db.Employees.Add(employees);
                        db.SaveChanges();
    
                        return RedirectToAction("Index");
                    } 
                    else if (ceo == 1 && employees.IsCEO == true) // check if there is a ceo, if yes show errormessage
                    {
                        ViewBag.ErrorMessage5 = "There is already a CEO in the database! You cannot create a second one!";
                    } 
                    else if(employees.IsCEO == false && employees.IsManager == false) // check if the employee is ceo or manager, if false its a regular employee
                    {
                        employees.Salary = employees.Salary * employeeSalary; // calculate regular employees salary
                        db.Employees.Add(employees);
                        db.SaveChanges();
                        return RedirectToAction("Index");
                    }
                    else if (employees.IsCEO == false && employees.IsManager == true) // manager
                    {
                        employees.Salary = employees.Salary * salaryManager; // manager salary
                        db.Employees.Add(employees);
                        db.SaveChanges();
                        return RedirectToAction("Index");
                    }
                }
    
                return View(employees);
            }
    
            // GET: Employees/Edit/5
            public ActionResult Edit(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Employees employees = db.Employees.Find(id);
    
                if (employees == null)
                {
                    return HttpNotFound();
                }
    
                return View(employees);
            }
    
            // POST: Employees/Edit/5
            // 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 Edit([Bind(Include = "Id,FirstName,LastName,Salary,IsCEO,IsManager,ManagerId")] Employees employees)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(employees).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(employees);
            }
    
            // GET: Employees/Delete/5
            public ActionResult Delete(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
    
                Employees employees = db.Employees.Find(id);
    
                if (employees == null)
                {
                    return HttpNotFound();
                }
    
                return View(employees);
            }
    
            // POST: Employees/Delete/5
            [HttpPost, ActionName("Delete")]
            [ValidateAntiForgeryToken]
            public ActionResult DeleteConfirmed(int id)
            {
                Employees employees = db.Employees.Find(id);
                db.Employees.Remove(employees);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
    
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    db.Dispose();
                }
                base.Dispose(disposing);
            }
        }
    }