C# Asp.net Mvc模型类作为继承的实体类

C# Asp.net Mvc模型类作为继承的实体类,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我扩展了一个实体框架类(SQL server表),并向子类添加了一些额外的属性,但当我想插入到已扩展的表中时,会出现以下异常: 找不到EntityType“Student.Models.Add.SubjectToStageModel”的映射和元数据信息 我的控制器: [HttpPost] public ActionResult SubjectToStage(SubjectToStageModel model) { try { if (ModelState.IsVa

我扩展了一个实体框架类(SQL server表),并向子类添加了一些额外的属性,但当我想插入到已扩展的表中时,会出现以下异常:

找不到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分部类SubjectToStageTbl
{
公共主体标记bl()
{
this.StudentMarkTbls=new HashSet();
}
公共int SubjectToStageId{get;set;}
public int SubjectId{get;set;}
公共int StageId{get;set;}
公共int点{get;set;}
公共虚拟StageTbl StageTbl{get;set;}
公共虚拟ICollection StudentMarkTbls{get;set;}
公共虚拟主题tbl 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;
        }
    }
}
公共类SubjectToStageModel:subjectToStageBl
{
公共可数舞台剧
{
得到
{
List ListSelectListItems=新列表();
尝试
{
使用(StudentEntities StudentEntities=新StudentEntities())
{
IQueryable queryableStage=studentEntities.StageTbls;
foreach(queryableStage中的var阶段)
{
SelectListItem SelectListItem=新建SelectListItem();
selectListItem.Value=stage.StageId.ToString();
选择ListItem.Text=stage.StageName;
添加(selectListItem);
}
}
}
捕获(异常)
{
Debug.WriteLine(exception.ToString());
}
返回列表SelectListItems;
}
}
公共IEnumerable SubjectListItem
{
得到
{
List ListSelectListItems=新列表();
尝试
{
使用(StudentEntities StudentEntities=新StudentEntities())
{
IQueryable queryableSubject=studentEntities.SubjectTbls;
foreach(queryableSubject中的var阶段)
{
SelectListItem SelectListItem=新建SelectListItem();
selectListItem.Value=stage.SubjectId.ToString();
选择ListItem.Text=stage.SubjectName;
添加(selectListItem);
}
}
}
捕获(异常)
{
Debug.WriteLine(exception.ToString());
}
返回列表SelectListItems;
}
}
}

您没有显式地将
主题映射到tagemodel
类。如果您希望实体框架使用派生类,那么还应该将它们添加到模型中。但我认为你一开始并不打算这么做

实际上,
SubjectToStageModel
是一个视图模型。从实体类派生视图模型看起来很方便,但我认为一般来说这不是一个好主意。视图模型应该根据它们所使用的视图(或用例)进行定制。有几个原因:

  • 很可能entity类包含的属性比视图中需要的多。在以后的维护中,不断检查您所做的和不需要的总是一件痛苦的事情
  • 随着视图的发展,它可能需要与实体不同的结构模型
  • 视图可能需要不同的验证
  • 视图可能被允许返回一个绝对不应该被存储的状态(您可能需要对输入的数据进行一些后处理),因此最好确保它不可能被存储
  • 它在数据层模型和视图之间创建依赖关系
也许这些考虑不适用于你的情况。不过我还是希望有一个独立的视图模型。但是,如果您懒惰(我们开发人员更喜欢“务实”一词),您可以通过以下方式获得成功:

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

(但我从未尝试过)。

你的问题是什么?陈述一大堆事实,然后期望我们知道你想知道什么不是一个好的提问方式。