2015-02-07 246 views
3

我已經擴展了一個實體框架類(SQL服務器表),並添加了一些額外的屬性到子類,但是當我想插入到我已經擴展的表中時,我得到了這個例外:Asp.net Mvc模型類繼承實體類

無法找到EntityType'Student.Models.Add.SubjectToStageModel'的映射和元數​​據信息。

我的控制器:

[HttpPost] 
public ActionResult SubjectToStage(SubjectToStageModel model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      using (StudentEntities studentEntities = new StudentEntities()) 
      { 
       int intCount = 
        studentEntities.SubjectToStageTbls.Count(
         x => x.StageId == model.StageId && x.SubjectId == model.SubjectId); 
       if (intCount == 0) 
       { 
        studentEntities.SubjectToStageTbls.Add(model); 
        studentEntities.SaveChanges();       
       } 
      } 
     } 
    } 
    catch (Exception exception) 
    { 
     Debug.WriteLine(exception.ToString()); 
     TempData["error"] = "An error occured"; 
    } 
    return RedirectToAction("SubjectToStage"); 
} 

我的基類:

public partial class SubjectToStageTbl 
{ 
    public SubjectToStageTbl() 
    { 
     this.StudentMarkTbls = new HashSet<StudentMarkTbl>(); 
    } 

    public int SubjectToStageId { get; set; } 
    public int SubjectId { get; set; } 
    public int StageId { get; set; } 
    public int Point { get; set; } 

    public virtual StageTbl StageTbl { get; set; } 
    public virtual ICollection<StudentMarkTbl> StudentMarkTbls { get; set; } 
    public virtual SubjectTbl SubjectTbl { get; set; } 
} 

我的子類:

public class SubjectToStageModel : SubjectToStageTbl 
{ 
    public IEnumerable<SelectListItem> StageListItem 
    { 
     get 
     { 
      List<SelectListItem> listsSelectListItems = new List<SelectListItem>(); 
      try 
      { 
       using (StudentEntities studentEntities = new StudentEntities()) 
       { 
        IQueryable<StageTbl> queryableStage = studentEntities.StageTbls; 
        foreach (var stage in queryableStage) 
        { 
         SelectListItem selectListItem = new SelectListItem(); 
         selectListItem.Value = stage.StageId.ToString(); 
         selectListItem.Text = stage.StageName; 
         listsSelectListItems.Add(selectListItem); 
        } 
       } 
      } 
      catch (Exception exception) 
      { 
       Debug.WriteLine(exception.ToString()); 
      } 
      return listsSelectListItems; 
     } 
    } 

    public IEnumerable<SelectListItem> SubjectListItem 
    { 
     get 
     { 
      List<SelectListItem> listsSelectListItems = new List<SelectListItem>(); 
      try 
      { 
       using (StudentEntities studentEntities = new StudentEntities()) 
       { 
        IQueryable<SubjectTbl> queryableSubject = studentEntities.SubjectTbls; 
        foreach (var stage in queryableSubject) 
        { 
         SelectListItem selectListItem = new SelectListItem(); 
         selectListItem.Value = stage.SubjectId.ToString(); 
         selectListItem.Text = stage.SubjectName; 
         listsSelectListItems.Add(selectListItem); 
        } 
       } 
      } 
      catch (Exception exception) 
      { 
       Debug.WriteLine(exception.ToString()); 
      } 
      return listsSelectListItems; 
     } 
    } 
} 
+1

你的問題到底是什麼?陳述一堆事實,然後期待我們找出你想知道的並不是一個提問的好方法。 – 2015-02-08 01:30:47

回答

1

你沒有明確映射SubjectToStageModel類。如果你希望實體框架能夠與派生類一起工作,你也應該將它們添加到模型中。但我認爲你本來並不打算這樣做。其實SubjectToStageModel是一個視圖模型。從實體類派生視圖模型可能看起來很方便,但我認爲這通常不是一個好主意。視圖模型應根據視圖(或用例)進行量身定製。原因如下:

  • 很可能實體類包含的視圖中的屬性超出了您的需要。在以後的維護中,不斷檢查你的工作和不需要的工作總是很痛苦的。
  • 雖然視圖不斷髮展,但它可能需要與實體不同的結構化模型。
  • 視圖可能需要不同的驗證。
  • 該視圖可能被允許返回絕對不應該存儲的狀態(您可能需要對輸入數據進行一些後處理),所以最好確保它不可能被存儲。
  • 它創建數據層模型和視圖之間的依賴關係。

也許這些考慮不適用於你的情況。儘管如此,我寧願有一個獨立的視圖模型。但是,如果你懶(我們開發者更喜歡這個詞務實),你可以通過做成功:

studentEntities.SubjectToStageTbls.Add((SubjectToStageTbl)model); 

(我從未想過試過)。