Asp.net mvc 在何处实例化新列表<;T>;?

Asp.net mvc 在何处实例化新列表<;T>;?,asp.net-mvc,asp.net-mvc-5,Asp.net Mvc,Asp.net Mvc 5,我的Asp.NETMVC项目中有以下模型。 创建新对象时,还将创建选项和Foto的新列表,以便您可以简单地向对象添加新选项和图片 public class VehicleModels { [Key] public virtual int Id { get; set; } public virtual string Naam { get; set; } public virtual string Merk { get; set; } public virtu

我的Asp.NETMVC项目中有以下模型。 创建新对象时,还将创建选项和Foto的新列表,以便您可以简单地向对象添加新选项和图片

public class VehicleModels
{
    [Key]
    public virtual int Id { get; set; }
    public virtual string Naam { get; set; }
    public virtual string Merk { get; set; }
    public virtual string Brandstof { get; set; }
    public virtual string Kleur { get; set; }
    public virtual string TypeVanMerk { get; set; }
    public virtual string TypeVanTransmissie { get; set; }
    public virtual int Kilometerstand { get; set; }
    public virtual int Bouwjaar { get; set; }
    public virtual int AantalDeuren { get; set; }
    public List<Optie> Options { get; set; }
    public List<Foto> Fotos { get; set; }

    public VehicleModels()
    {
        Options = new List<Optie>();
        Fotos = new List<Foto>();
    }  

}
我的问题:

调试时,我发现编辑方法中的这行代码(
var VehicleToUpdate=db.VehicleModels.Find(id);
)创建了模型的一个新对象,并且似乎将属性绑定到了该新对象。 但是因为它通过了构造函数,所以两个列表都被清除了

当我试图更改对象的图片时,问题就显现出来了,因为列表是空的,它不会删除任何图片,也不会添加新图片,相反,它只会再次添加旧图片,给我留下2倍的相同图片

我应该在其他地方实例化我的列表吗? 如果是,合适的地点在哪里


旁注:我按照教程将图像添加到我的项目中。

这两个列表不应该被
var VehicleToUpdate=db.VehicleModels.Find(id)清除。它们应该被适当地填充


如果它们没有被填充并且是空的,那么检查您的数据库。要么是数据不存在。如果数据存在,则外键约束将被破坏。检查并纠正相同的错误。更正数据库后,请更新项目中实体框架的edmx文件中的模型。之后,实体框架应适当填充数据,图像将更新,而不是添加副本。

不应通过
var VehicleToUpdate=db.VehicleModels.Find(id)清除这两个列表。它们应该被适当地填充


如果它们没有被填充并且是空的,那么检查您的数据库。要么是数据不存在。如果数据存在,则外键约束将被破坏。检查并纠正相同的错误。更正数据库后,请更新项目中实体框架的edmx文件中的模型。之后,实体框架应适当填充数据,图像将更新,而不是添加副本。

此模型中的任何内容都没有意义。您将属于此模型的所有属性设置为
virtual
,而不表示其他模型的属性;看起来应该是相反的。除此之外,您链接的教程使用的是
ICollection
而不是
List
,并且不会像这里那样在构造函数中初始化列表。如果对象是
虚拟的
,则不需要手动初始化构造函数。@Claies添加“virtual”并从构造函数中删除实例化对edit方法起到了作用,但当我在更新数据库后运行Seed方法时,它确实要求我在向列表/集合添加对象之前实例化该列表/集合,这是因为该对象尚未通过EF持久化,还是有其他原因?@Claies如果您想将您的注释转换为答案,我很乐意接受。这个模型没有任何意义。您将属于此模型的所有属性设置为
virtual
,而不表示其他模型的属性;看起来应该是相反的。除此之外,您链接的教程使用的是
ICollection
而不是
List
,并且不会像这里那样在构造函数中初始化列表。如果对象是
虚拟的
,则不需要手动初始化构造函数。@Claies添加“virtual”并从构造函数中删除实例化对edit方法起到了作用,但是,当我在更新数据库后运行Seed方法时,确实需要我在向列表/集合添加对象之前实例化该列表/集合,这是因为该对象尚未通过EF持久化,还是有其他原因?@clais如果您想将您的评论转化为答案,我很乐意接受。
[HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(int? id, HttpPostedFileBase upload)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            var VehicleToUpdate = db.VehicleModels.Find(id);
            if (TryUpdateModel(VehicleToUpdate))
            {
                try
                {
                    if (upload != null && upload.ContentLength > 0)
                    {
                        if (VehicleToUpdate.Fotos.Any(f => f.VehicleModelsID == VehicleToUpdate.Id))
                        {
                            db.Fotos.Remove(VehicleToUpdate.Fotos.First(f => f.VehicleModelsID == VehicleToUpdate.Id));
                        }

                        var picture = new Foto
                        {
                            FotoNaam = System.IO.Path.GetFileName(upload.FileName),
                            ContentType = upload.ContentType
                        };
                        using (var reader = new System.IO.BinaryReader(upload.InputStream))
                        {
                            picture.Content = reader.ReadBytes(upload.ContentLength);
                        }
                        VehicleToUpdate.Fotos.Add(picture);
                    }
                    db.Entry(VehicleToUpdate).State = EntityState.Modified;
                    db.SaveChanges();

                    return RedirectToAction("Index");
                }
                catch (RetryLimitExceededException /* dex */)
                {
                    //Log the error (uncomment dex variable name and add a line here to write a log.
                    ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator.");
                }
            }
            return View(VehicleToUpdate);

        }