C# 数据库(ASP.NET MVC)中缺少来自集合的数据

C# 数据库(ASP.NET MVC)中缺少来自集合的数据,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,为了简单和测试,我从一个新项目开始做这项工作,然后在我了解问题后将其应用到我的实际项目中 我制作了一个名为Person的模型,其中包含一个名为ServiceRequired的列表属性。前端用户可以根据自己的意愿编码任意多的服务字符串,因此动态创建ServiceRequired的输入字段。在POST方法中,这些字符串输入按预期绑定。我将Person对象保存到数据库中,并按预期工作。当我尝试从数据库中检索人员对象时,除了所需的服务之外,其他所有服务都存在 这是我的密码 模型(Person.cs):

为了简单和测试,我从一个新项目开始做这项工作,然后在我了解问题后将其应用到我的实际项目中

我制作了一个名为Person的模型,其中包含一个名为ServiceRequired的列表属性。前端用户可以根据自己的意愿编码任意多的服务字符串,因此动态创建ServiceRequired的输入字段。在POST方法中,这些字符串输入按预期绑定。我将Person对象保存到数据库中,并按预期工作。当我尝试从数据库中检索人员对象时,除了所需的服务之外,其他所有服务都存在

这是我的密码

模型(Person.cs):

正如我所说的,所需服务的输入字段是动态创建的,但正确地绑定到模型

以下是运行时的一些屏幕截图:

用户进行一些输入后:

在索引返回要在运行时签入的视图之前,我添加了一个变量:


如图所示,同样的在场,除了服务以外的一切都需要。一般来说,我对ASP.NETMVC和web开发相当陌生。我确实处理项目中的其他集合,尽管它们是对象的集合。只有这件事我不明白。我的错误可能在哪里?

如果未启用延迟加载,则需要告诉dbcontext加载引用

第一次将
serviceRequired
更改为虚拟财产

public virtual List<String> ServiceNeeded { get; set; }

关于加载相关实体的文章

查看数据库;有记录吗?我认为问题在于服务所需的集合没有持久化到数据库中;尝试添加:

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "Id,Name,ServiceNeeded")] Person person)
    {
        if (ModelState.IsValid)
        {
            person.Id = Guid.NewGuid();
            db.People.Add(person);

            foreach (var service in person.ServicesNeeded)
                 db.ServicesNeeded.Add(service);

            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(person);
    }

我不相信连接到Person对象的关系在SaveChanges()上会自动持久化,并且可能不会保存到数据库中。

我认为适合实体框架的最佳方法是为您的“ServiceNeeded”创建另一个
模型
,将其添加到“DbContext”中,将所有服务保存在相应的
DbSet
中,并使用
检索它们。在
LINQ
中包含
。在这篇冗长的介绍之后,请查看以下代码:
在您的机型中:

public class MyService{
    public Guid Id {get;set;}
    public string ServiceName {get;set;}
    public Guid PersonId {get;set;}
}
public class Person
{
    public Guid  Id { get; set; }
    public String Name { get; set; }
    public virtual IList<MyService> ServiceNeeded { get; set; }
}
public System.Data.Entity.DbSet<MyService> MyServices { get; set; }
public System.Data.Entity.DbSet<Person> People { get; set; }
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,Name,ServiceNeeded")] Person person, List<String> ServiceNeeded)
{
    if (ModelState.IsValid)
    {

        db.People.Add(person);
        db.SaveChanges();
        db.Entry(person).GetDatabaseValues();
         foreach (string service in ServiceNeeded){
             db.MyServices.Add( new MyService {ServiceName = service,
                   PersonId = person.Id})
        }
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(person);
}
public ActionResult Index()
{
    var x = db.People.Include("ServiceNeeded").ToList();
    return View(x);
}

谢谢你的回复,先生,但是如果我理解你的方法,我必须为这一系列服务单独制作一张表。我正在尽可能地避免这种情况。你必须把它们保存在某个地方,你在哪里保存它们?或者问题是你没有拯救他们;您不需要另一个表,只需向Person对象添加一个字符串列,然后在保存到DB时,将由|或其他内容分隔的值串联起来,然后在加载时拆分它们。但是,我建议您在将自定义属性添加到EF生成的实体时要小心,这些实体不是EF加载的属性,因为您可能会遇到错误,因为您无法在LINQ和其他EF引发异常的操作中使用这些属性。谢谢您的回复,先生。我按照你的建议做了修改,但似乎没有解决我的问题。添加“Include”时,出现以下错误:其他信息:指定的Include路径无效。EntityType“WebApplication3.Models.Person”未声明名为“ServiceRequired”的导航属性。我也在尝试不同的加载方法,但到目前为止没有任何进展。
public System.Data.Entity.DbSet<MyService> MyServices { get; set; }
public System.Data.Entity.DbSet<Person> People { get; set; }
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "Id,Name,ServiceNeeded")] Person person, List<String> ServiceNeeded)
{
    if (ModelState.IsValid)
    {

        db.People.Add(person);
        db.SaveChanges();
        db.Entry(person).GetDatabaseValues();
         foreach (string service in ServiceNeeded){
             db.MyServices.Add( new MyService {ServiceName = service,
                   PersonId = person.Id})
        }
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(person);
}
public ActionResult Index()
{
    var x = db.People.Include("ServiceNeeded").ToList();
    return View(x);
}