Asp.net mvc 创建新实体并调用SaveChanges将其保存回数据库MVC

Asp.net mvc 创建新实体并调用SaveChanges将其保存回数据库MVC,asp.net-mvc,Asp.net Mvc,在下面的代码中,我试图将一个新设施添加到我的设施表中。Save方法调用DbContext SaveChanges。在SaveChanges执行之后,我希望newFacility会为它生成一个Id,但它不会,也不会保存到数据库中。我向设施数据库集添加新设施的方式是否有问题 [HttpPost] public ActionResult Create(CreateFacilityViewModel viewModel) {

在下面的代码中,我试图将一个新设施添加到我的设施表中。Save方法调用DbContext SaveChanges。在SaveChanges执行之后,我希望newFacility会为它生成一个Id,但它不会,也不会保存到数据库中。我向设施数据库集添加新设施的方式是否有问题

[HttpPost]
            public ActionResult Create(CreateFacilityViewModel viewModel)
            {
                if (ModelState.IsValid)
                {
                    var facilities = _db.Facilities;
                    var newFacility = new Facility();

                    //newFacility.FacilityId = viewModel.FacilityId;
                    newFacility.FaclityName = viewModel.FaclityName;
                    newFacility.Address = viewModel.Address;
                    newFacility.City = viewModel.City;
                    newFacility.State = viewModel.State;

                    _db.Facilities.ToList().Add(newFacility);

                    _db.Save();

                    return RedirectToAction("detail", "facility", new { id = newFacility.FacilityId });
                }
                return View(viewModel);
            }
设施看起来像这样

 public DbSet<Facility> Facilities { get; set; }
  IQueryable<Facility> IGolfDataSource.Facilities
        {
            get { return Facilities; }
        }
改变

您希望将对象添加到上下文中,而不是列表中。

更改

_db.Facilities.ToList().Add(newFacility);

您希望将对象添加到上下文中,而不是列表中。

问题在于:

_db.Facilities.ToList().Add(newFacility);
当您调用ToList时,它正在内存中创建一个新列表,然后您将新的工具添加到新的内存列表中。相反,您希望将新设施直接添加到数据库集中:

_db.Facilities.Add(newFacility);
问题在于:

_db.Facilities.ToList().Add(newFacility);
当您调用ToList时,它正在内存中创建一个新列表,然后您将新的工具添加到新的内存列表中。相反,您希望将新设施直接添加到数据库集中:

_db.Facilities.Add(newFacility);

如果不想将设施公开为数据库集,则Add在设施上不可用(可选)。您可以在_db上创建AddFacility方法。在AddFacility方法中,您可以访问数据库集并使用它的Add方法。如果您不想将设施公开为数据库集,则Add在Facility上不可用。您可以在_db上创建AddFacility方法。在AddFacility方法中,您可以访问DbSet并使用它的Add方法。如果Add在facility上不可用,则需要更改_db上的facility类型。它应该作为一个DbSet公开。我通过返回IQueryable来公开一个DbSet。请参阅上面的代码。如果需要将IQueryable更改为DbSet,则添加将起作用。如果设备上没有添加,则需要更改_db上的设备类型。它应该作为一个DbSet公开。我通过返回IQueryable来公开一个DbSet。请参阅上面的代码。如果您需要将IQueryable更改为DbSet,则添加将起作用。