gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:45:07 25 4
gpt4 key购买 nike

我已经扩展了一个 Entity Framework 类(SQL 服务器表)并向子类添加了一些额外的属性,但是当我想插入到我已经扩展的表中时,我得到了这个异常:

Mapping and metadata information could not be found for EntityType 'Student.Models.Add.SubjectToStageModel'.

我的 Controller :

[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;
}
}
}

最佳答案

您没有显式映射 SubjectToStageModel 类。如果您希望 Entity Framework 与派生类一起工作,您也应该将它们添加到模型中。但我认为您一开始并不打算这样做。

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

  • 很可能实体类包含的属性多于您在 View 中需要的属性。在以后的维护中,不断检查你做什么和不需要什么总是一件痛苦的事情。
  • 随着 View 的发展,它可能需要与实体不同的结构化模型。
  • View 可能需要不同的验证。
  • 可以允许 View 返回绝对不应存储的状态(您可能需要对输入的数据进行一些后处理),因此最好确保它不可能被存储。
  • 它在数据层模型和 View 之间创建依赖关系。

也许这些考虑不适用于您的情况。我仍然希望有一个独立的 View 模型。但是,如果您很懒惰(我们开发人员更喜欢务实这个词),您可能会成功:

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

(虽然我从未尝试过)。

关于c# - Asp.net Mvc 模型类作为继承的实体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28384375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com