2015-02-07 113 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); 

(我从未想过试过)。