2014-12-17 4 views
0

Я использовал EF Designer из базы данных для создания моих моделей из базы данных, созданной для моего проекта. Для одного контроллера мне нужно обратиться к нескольким моделям. Примером этого является таблица пользователей, которая содержит пользовательский отдел и офис. Мне нужно указать две отдельные таблицы 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.

Я прочитал, что я могу создать модель представления, чтобы создать новую модель, которая объединяет модели, которые я хочу использовать, чтобы я мог получать информацию из всех соответствующих таблиц в одном контроллере.

Мой пример 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; } 
    } 
} 

При попытке создать контроллер с этой точки зрения модели, я получаю сообщение об ошибке сказав:

User :: EntityType 'Пользователь' не имеет ключа определен. Определите ключ для этого типа сущности. OfficePermission :: EntityType «OfficePermission» не имеет определенного ключа. Определите ключ для этого типа сущности. DepartmentPermission :: EntityType 'DepartmentPermission' не определил ключ. Определите ключ для этого типа сущности. HomeViewModel :: EntityType «HomeViewModel» не имеет ключа. Определите ключ для этого типа сущности. Пользователи: EntityType: EntitySet «Пользователи» основаны на типе «Пользователь», который не имеет определенных ключей. OfficePermissions: EntityType: EntitySet «OfficePermissions» основан на типе «OfficePermission», который не имеет определенных ключей. DepartmentPermissions: EntityType: EntitySet 'DepartmentPermissions' основан на типе 'DepartmentPermission', который не имеет определенных ключей. HomeViewModels: EntityType: EntitySet «HomeViewModels» основан на типе «HomeViewModel», который не имеет определенных ключей.

Я могу определить ключи вручную в автогенерируемых файлах, однако это будет отменено, когда база данных будет изменена и файлы потребуют автоматической регенерации.

Есть ли способ объединить эти автогенерированные модели, чтобы использовать их вместе в контроллере?

+0

Ma Убедитесь, что ваша модель имеет уникальный ключ, отличающий каждую строку. –

+1

Показать код, который вы пробовали! –

ответ

1

У вас есть различные варианты, которые Вы можете использовать любой из них

Использование 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 

И, как вы заявили, что вы В таблице ошибок tting нет определенного ключа, вы должны правильно определить ключи для таблиц.

Использование Кортеж

Кортеж используется для хранения различных types.You может хранить ваши необходимые классы объектов в нем и передать для просмотра

В контроллере

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

В связи вы будете получить его следующим образом:

@model Tuple<int,string> 
Смежные вопросы