ASP.NET EF6 - 2表& 1链接表

时间:2015-06-15 15:26:41

标签: c# sql-server asp.net-mvc entity-framework

我不是最流利的ASP.NET / EF,所以我有点难以找到完成我需要完成的工作的最佳方法。我尝试使用现有数据库创建CRUD。

而不是Employees表具有联系信息的特定列,他们设计它链接到Contact_Info表,Contact_Links是中间人。

我有3张桌子:

员工
列:EmployeeID(PK),FirstName,LastName

通过Contact_ID = EmployeeID

联系人链接的员工链接

Contact_Links
列:ID(PK),Contact_ID(FK),Contact_Info_ID(FK),类型

Contact_Links通过Contact_Info_ID = ID

链接到Contact_Info

Contact_Info
列:ID(PK),数据

Contact_Links中的类型列确定它是电子邮件地址,手机,传真等。因此它实际上不仅仅是PK / FK表。

也许最简单的方法是先让Action Method创建一个Employee,然后在一个选项的详细信息页面中添加一个Contact Info项?我不确定从哪里开始绘制它。

任何有关我尝试做什么的最佳方法的建议都会非常感激!

2 个答案:

答案 0 :(得分:0)

取决于您的要求。如果你尝试做多对多关系,那么最好不要在连接表中使用任何主键(或者在这种情况下使用实体)这样你就不必担心映射实体/表了。

答案 1 :(得分:0)

如果您要在同一表单上添加员工及其联系信息,则应使用“查看模型”。

您的视图模型将您在Employee和Contact中所需的属性合并到一个类中。然后,您将实现Employee创建/查看/编辑屏幕以期望您的EmployeeContactViewModel,您将可以访问所需的所有属性。

Controller上的Save / Edit方法将使用EmployeeContactViewModel作为类型。然后,您将能够将其安排到正确的结构中以持久保存到您的数据库中。

看看这个问题的答案:What is ViewModel in MVC?

快速谷歌使用View Models并且你将会飞行!

编辑: 感谢您进一步澄清您的问题。

将View Model传递给控制器​​后,您将不得不进行一系列插入操作。

以下是您的控制器方法:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(EmployeeContactViewModel employeecontactviewmodel)
    {
        if (ModelState.IsValid)
        {
            var employee = new EmployeeModel {
                FirstName = employeecontactviewmodel.FirstName,
                LastName = employeecontactviewmodel.LastName
            };

            var contact = new ContactInfoModel {
                Data = employeecontactviewmodel.ContactInfo
            };


            db.Employee.Add(employee);
            db.Contact.Add(contact);
            db.SaveChanges();

            var contactLink = new ContactLinkModel {
                ContactID = employee.ID,
                ContactInfoID = contact.ID
            };

            db.ContactInfo.Add(contactLink);
            db.SaveChanges();

            return RedirectToAction("Index");
        }

        return View(employeecontactviewmodel);
    }