2015-06-05 2 views
2

Я недавно изучал asp.net MVC 5 и EF6, и я начал разрабатывать модели просмотра для своих представлений вместо наложения значений в сумку.ViewModel «no key defined» error

Я это мой ViewModel называется EmployeeCreate

namespace Rota.ViewModels 
{ 
    public class EmployeeCreate 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public IEnumerable<SelectListItem> Departments { get; set; } 
    } 
} 

, что я хотел бы сделать это на создании [httpget] action method, чтобы иметь возможность заполнить выпадающий список

это мой Сотрудник enitity

namespace Rota.Models 
{ 
    public class Employee 
    { 
     public int ID { get; set; } 

     [Required] 
     [Display(Name = "First Name")] 
     public string FirstName { get; set; } 

     [Required] 
     [Display(Name = "Last Name")] 
     public string LastName { get; set; } 

     [ForeignKey("Department")] 
     [DisplayFormat(NullDisplayText="No Department")] 
     public int? DepartmentID { get; set; } 

     public virtual Department Department { get; set; } 
     public virtual ICollection<Schedule> Schedule { get; set; } 

    } 
} 

и это мой Департамент организация

namespace Rota.Models 
    { 
     public class Department 
     { 
      [DatabaseGenerated(DatabaseGeneratedOption.None)] 
      public int ID { get; set; } 

      [Required] 
      public string Name { get; set; } 

      public virtual ICollection<Employee> Employees { get; set; } 
     } 
    } 

Редактировать это мой DbContext класс

public class RotaContext : DbContext 
    { 
     public RotaContext() : base("RotaContext") 
     { 

     } 

     public DbSet<Department> Departments { get; set; } 
     public DbSet<Shift> Shifts { get; set; } 
     public DbSet<Employee> Employees { get; set; } 
     public DbSet<Schedule> Scheduled { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
     } 

     public System.Data.Entity.DbSet<Rota.ViewModels.EmployeeCreate> CreateEmployeeViewModels { get; set; } 

    } 

это мой Создать Действие метод в моем контроллере

namespace Rota.Controllers 
{ 
    public class EmployeeController : Controller 
    { 
     //establish database connection 
     private RotaContext db = new RotaContext(); 

     //GET: Employee/Create 
     [HttpGet] 
     public ActionResult Create() 
     { 
      EmployeeCreate ViewModel = new EmployeeCreate() 
      { 
       Departments = db.Departments.Select(department => new SelectListItem { 
        Value = department.ID.ToString(), 
        Text = department.Name 
       }) 
      }; 
      return View(ViewModel); 
     } 
    } 
} 

Проблема я» ве GOT является то, что я получаю эту ошибку:

Один или несколько ошибок проверки были обнаружены в процессе генерации модели:

Rota.Entities.EmployeeCreate:: EntityType 'EmployeeCreate' не имеет ключа определен. Определите ключ для этого EntityType. CreateEmployeeViewModels: EntityType: EntitySet 'CreateEmployeeViewModels' основан на типе «EmployeeCreate», который не имеет определенных ключей.

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

Полный Трассировка стека

[ModelValidationException: Один или несколько ошибок проверки были обнаружены в процессе генерации модели:

Rota.Entities.EmployeeCreate:: EntityType 'EmployeeCreate' не имеет ключа определенный , Определите ключ для этого EntityType. CreateEmployeeViewModels: EntityType: EntitySet 'CreateEmployeeViewModels' основан на типе «EmployeeCreate», который не имеет определенных ключей. ]
System.Data.Entity.Core.Metadata.Edm.EdmModel.Validate() +338
System.Data.Entity.DbModelBuilder.Построить (DbProviderManifest providerManifest, DbProviderInfo providerInfo) +370
System.Data.Entity.DbModelBuilder.Build (DbConnection providerConnection) +288
System.Data.Entity.Internal.LazyInternalContext.CreateModel (LazyInternalContext internalContext) +94
System.Data.Entity.Internal.RetryLazy 2.GetValue(TInput input) +248
System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +543 System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) +26
System.Data.Entity.Internal.Linq.InternalSet
1.Initialize() +72
System.Data.Entity.Internal.Linq.InternalSet 1.get_InternalContext() +21 System.Data.Entity.Infrastructure.DbQuery 1.System.Linq.IQueryable.get_Provider() +64 System.Linq. Queryable.Select (IQueryable 1 source, Expression 1 селектор) +85 Rota.Controllers.EmployeeController.Create() в d: \ Dev elopment \ Rota \ \ Rota Контроллеры \ EmployeeController.cs: 87
lambda_method (Закрытие, ControllerBase, Object []) +79
System.Web.Mvc.ReflectedActionDescriptor.Execute (ControllerContext controllerContext, IDictionary параметры) + 39
System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39 (IAsyncResult AsyncResult, ActionInvocation innerInvokeState) +12
System.Web.Mvc.Async.WrappedAsyncResult 2.CallEndDelegate(IAsyncResult asyncResult) +139
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +112 System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +452 System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +15
System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +37 System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +241
System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
System.Web.Mvc.Async.WrappedAsyncVoid
1.CallEndDelegate (IAsyncResult AsyncResult) +111
системы. Web.Mvc.Controller.EndExecuteCore (IAsyncResult asyncResult) +53 System.Web.Mvc.Async.WrappedAsyncVoid 1.CallEndDelegate(IAsyncResult asyncResult) +19
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +51
System.Web.Mvc.Async.WrappedAsyncVoid
1.CallEndDelegate (IAsyncResult AsyncResult) +111
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep (IExecutionStep шаг, Boolean & completedSynchronously) +288

+1

Вы можете показать полный стек? –

ответ

3
public System.Data.Entity.DbSet<Rota.ViewModels.EmployeeCreate> CreateEmployeeViewModels { get; set; } 

Это не является обязательным в контексте вашего класса. Если у вас это есть, EF пытается создать объект DB для вашей модели viewmodel. Для каждого «DbSet», который вы даете в контексте класса, EF создает объект DB. Попробуйте удалить это.

+0

честно не заметил, что сгенерировано, спасибо. – Goodsoup

+3

В MVC 5 удалите класс контекста данных из поля «Контекст данных» в диалоговом окне создания представления. –