如何首先使用 EF 代码将包含对象列表的对象绑定并保存到 MVC ASP.NET 数据库上下文?



我是MVC新手 ASP.NET。我试图构建一个模型,如下所示(假设语法没问题)。我想知道如何绑定和保存包含对象列表的对象。例如。在下面的代码中,我想将SchoolGrade类型的对象保存到数据库中(如果它不包含List<Chapter>或创建一个单独的数据库集用于Chapter并通过 Id 链接,则可以正常工作)。

SchoolGrade对象有 2 个类型为List<Chapter>的列表,一个用于物理,另一个用于数学。 假设我正确地填充了物理和数学的列表,我不确定如何将上下文作为一个整体保存,SchoolGrade包括两个列表。

注意:我使用的是 2List<Chapter>而不是有一个List<Chapter>并在Chapter类中有一个类型,因为我想在 HTML 的不同部分中动态添加和删除物理和数学章节以保持简洁的设计。

代码片段:

namespace School.Models
{
public class SchoolGrade
{
public Guid SchoolGradeID {get; set;}
public string SchoolGradeName {get; set;} //eg. 8th Grade
public List<Chapter> Physics {get; set;} //eg. List of chapters for physics course
public List<Chapter> Maths {get; set;} //eg. List of chapters for maths course
public SchoolGrade()
{
Physics = new List<Chapter>();
Maths = new List<Chapter>();
}
}
public class Chapter
{
public string ChapterName {get; set;}
public string ChapterContent {get; set;}
}
}
namespace School.Controllers
{
public class SchoolGradesController : Controller
{
private SchoolGradeContext db = new SchoolGradeContext();
}
public ActionResult Create()
{
var schoolGrade = new SchoolGrade();
return View(job);
}
[HttpPost]
public ActionResult Create(SchoolGrade schoolGrade)
{
if (ModelState.IsValid)
{
db.SchoolGrades.Add(schoolGrade);
db.SaveChanges();
}
return View(schoolGrade);
}
}
namespace School.DAL
{
public class SchoolGradeContext : DbContext
{
public PipelineContext() : base("PipelineContext")
{
}
public DbSet<SchoolGrade> SchoolGrades { get; set; }
}
}

您能否指出遵循设计的最佳方法?我尝试浏览与此相关的许多主题,但没有一个主题提供有关将更改保存到数据库的任何上下文(不使用单独的数据库集)。

感谢您提前提供帮助。

在 Chapter 类上试用 ForeignKey 属性,其中包含一个携带 SchoolGradeID 的字段。

例如:

public class Chapter
{
public string ChapterName {get; set;}
public string ChapterContent {get; set;}
[ForeignKey("SchoolGrade")]
public Guid SchoolGradeID {get; set;}
}

我认为您应该考虑在设计中涉及继承,只有一个Chapters集合SchoolGrade结果更简洁的设计(您不需要为每个新Chapter添加新属性),您将摆脱有关使用 EF 映射的问题。

public class Chapter
{
public int Id { get; set; }
...
}
public class PhysicsChapter : Chapter
{
...
}
public class MathsChapter : Chapter
{
...
}
public class SchoolGrade
{
public int Id { get; set; }
public List<Chapter> Chapters { get; set; }
...
}
public class SchoolGradeContext : DbContext
{
public SchoolGradeContext() : base("SchoolGradeContext")
{
}
public DbSet<SchoolGrade> SchoolGrades { get; set; }
public DbSet<Chapter> Chapters { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Chapter>().Map<PhysicsChapter>(m => m.Requires("ChapterTypeId").HasValue(1));
modelBuilder.Entity<Chapter>().Map<MathsChapter>(m => m.Requires("ChapterTypeId").HasValue(2));
}
}

这需要在Chapter表上ChapterTypeId一些鉴别器列。

最新更新