首页 文章

在单个控制器中使用多个模型[关闭]

提问于
浏览
0

我使用数据库中的EF Designer从为我的项目创建的数据库中构建我的模型 . 对于单个控制器,我需要引用多个模型 . 这方面的一个例子是有一个Users表,其中包含用户部门和办公室 . 我需要引用两个单独的表DepartmentPermissions和OfficePermissions来确定用户能够看到的数据 .

以下是自动生成模型的示例:

//------------------------------------------------------------------------------
// <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 Project.Models
{
    using System;
    using System.Collections.Generic;

    public partial class User
    {
        public int User_ID { get; set; }
        public string User_Username { get; set; }
        public string User_Department { get; set; }
        public string User_Office { 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 Project.Models
{
    using System;
    using System.Collections.Generic;

    public partial class DepartmentPermission
    {
        public int DeptPerm_ID { get; set; }
        public string DeptPerm_Department { get; set; }
        public string DeptPerm_Role { 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 Project.Models
{
    using System;
    using System.Collections.Generic;

    public partial class OfficePermission
    {
        public string OffPerm_OfficeID { get; set; }
    }
}

每个表中的第一列是数据库中的主键 .

使用任何这些自动生成的模型创建控制器时,一切正常,除了我只能使用一个表 .

我希望能够从Users表中检查用户的部门和办公室,然后从DepartmentPermissions表中检查与用户部门关联的角色,然后检查用户的办公室是否在OfficePermissions表中 .

我读到我可以构建一个View Model来创建一个新模型,它结合了我想要使用的模型,这样我就可以从一个控制器中的所有相关表中获取信息 .

我的示例ViewModel是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Project.Models
{
    public class HomeViewModel
    {            
        public IEnumerable<User> Users { get; set; }
        public IEnumerable<OfficePermission> OfficePermissions { get; set; }
        public IEnumerable<DepartmentPermission> DepartmentPermissions { get; set; } 
    }
}

当我尝试使用此视图模型创建Controller时,我收到错误消息:

User :: EntityType'User'没有定义键 . 定义此实体类型的键 . OfficePermission :: EntityType'OfficePermission'没有定义键 . 定义此实体类型的键 . DepartmentPermission :: EntityType'DepartmentPermission'没有定义键 . 定义此实体类型的键 . HomeViewModel :: EntityType'HomeViewModel'没有定义键 . 定义此实体类型的键 . 用户:EntityType:EntitySet'Users'基于没有定义键的'User'类型 . OfficePermissions:EntityType:EntitySet'OfficePermissions'基于类型'OfficePermission',没有定义键 . DepartmentPermissions:EntityType:EntitySet'DepartmentPermissions'基于类型'DepartmentPermission',没有定义键 . HomeViewModels:EntityType:EntitySet'HomeViewModels'基于类型'HomeViewModel',没有定义键 .

我可以在自动生成的文件中手动定义密钥,但是当更改数据库并且文件需要自动重新生成时,这将被取消 .

有没有办法组合这些自动生成的模型,以便在控制器中一起使用它们?

1 回答

  • 1

    你有不同的选择,你可以使用其中任何一个

    Use ViewModel

    对于视图模型,您必须创建一个类,在此类中,您将所有模型定义为此类的属性 . 这里有两个类 .

    public class EmployeeDetails
    {
        [Required]
        [Display(Name = "Name")]
        public string Name { get; set; }
    
    }
    
    public class Employee
    {
        public int Id { get; set; }
    }
    

    这是viewmodel

    public class ViewModel
    {
        public Employee emp { get; set; }
        public EmployeeDetails empdet{ get; set; }
    }
    

    现在在控制器中你会这样做

    public ActionResult About()
    {
            ViewModel vm = new ViewModel();
            vm.emp = new Employee();
            vm.empdet = new EmployeeDetails();
            return View(vm);
    }
    

    在视图中,你会收到这样的

    @model ViewModel
    

    并且正如您所说,您正在获取错误表没有定义键,您应该正确定义表的键 .

    Use Tuple

    元组用于存储不同的类型 . 您可以将所需的类对象存储在其中并传递给视图

    在控制器中

    Tuple<int, string> tuple = new Tuple<int, string>(1, "Hello world");
    return View(tuple);
    

    在视图中,您将收到这样的信息

    @model Tuple<int,string>
    

相关问题