2015-06-05 65 views
2

我最近一直在學習asp.net MVC 5和EF6,我已經開始爲我的視圖開發viewmodels,而不是將值填入viewbag。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); 
     } 
    } 
} 

麻煩我」創建行動方法已經得到的是,我不斷收到此錯誤:模型生成過程中檢測到

一個或多個驗證錯誤:

Rota.Entities.EmployeeCreate:的EntityType「EmployeeCreate」沒有定義鍵 。定義此EntityType的關鍵字。 CreateEmployeeViewModels: EntityType:EntitySet'CreateEmployeeViewModels'基於 'EmployeeCreate',它沒有定義鍵。

我不知道爲什麼應用程序認爲我的視圖模型是一個實體,我看不到任何東西在這裏,我想我是從數據庫填充的對象與值可能顯示爲這樣,據我所知,並且因爲視圖模型與除此以外的實體完全沒有關聯,所以它不需要密鑰,因爲它不需要唯一的標識符。

完整堆棧跟蹤

[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 selector)+85 Rota.Controllers.EmployeeController.Create()in d:\ Dev elopment \羅塔島\羅塔島\控制器\ EmployeeController.cs:87
lambda_method(封閉,ControllerBase,對象[])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一步,布爾& completedSynchronously)+ 288

+1

你能展示完整的堆棧嗎? –

回答

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

這是不是在你的上下文類要求。如果你有這個,EF會嘗試爲你的viewmodel創建DB對象。對於您在上下文類中提供的每個「DbSet」,EF創建DB對象。嘗試刪除此。

+0

老老實實沒有注意到已經生成了,謝謝。 – Goodsoup

+3

在MVC 5中,在創建視圖對話框中從「數據上下文類」字段中刪除數據上下文類。 –