【问题标题】:mvc poco list is null: add new itemmvc poco list 为空:添加新项目
【发布时间】:2013-08-21 17:04:09
【问题描述】:

我的 MVC4 项目中有以下 POCO:

public class Gallery : ModelBase
{
    public string Name { get; set; }
    public string Description { get; set; }
    public bool IsPublic { get; set; }
    public string ThumbnailPath { get; set; }

    [ForeignKey("Id")]
    public ICollection<GalleryImage> Images { get; set; }
}

如果我创建一个新的 Gallery 实体,则 Images Collection 为空。如何将新图像(在我的情况下)添加到未初始化列表中? 我的添加代码如下所示:

Guid gGallery = Guid.Parse(Request.Form.GetValues("galleryId")[0]);
            Gallery gallery = db.Galleries.Where(g => g.Id == gGallery).Include(g => g.Images).First();

            galleryimage.Id = Guid.NewGuid();
            galleryimage.CreatedByUserId = WebSecurity.CurrentUserId;
            galleryimage.InsertDate = DateTime.Now;
            galleryimage.LastModDate = DateTime.Now;

            db.GalleryImages.Add(galleryimage);
            if (gallery.Images == null)
                gallery.Images = new List<GalleryImage>();
            gallery.Images.Add(galleryimage);

            db.SaveChanges();

代码在运行时中断并出现此异常(对不起,仅在德语中):

Ein Objekt vom Typ 'System.Collections.Generic.List`1[[gallery.Models.GalleryImage, gallery, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' kann für eine EntityReference vom Typ ' gallery.Models.GalleryImage' nicht als Value-Eigenschaft festgelegt oder daraus entfernt werden。

现在如何向未初始化的集合添加新项目?

【问题讨论】:

    标签: asp.net asp.net-mvc collections poco


    【解决方案1】:

    你的 POCO 有问题,应该如下:

    public class Gallery : ModelBase
    {
        public string Name { get; set; }
        public string Description { get; set; }
        public bool IsPublic { get; set; }
        public string ThumbnailPath { get; set; }
    
        // remove the ForeignKey attr. That should be in GalleryImage itself
        public ICollection<GalleryImage> Images { get; set; }
    }
    

    那你的代码有很多问题。

    首先您应该使用Guid.TryParse 或验证 Guid 是有效的 Guid。

    那么你应该使用Request.Form.GetValues("galleryId")[0],你可以得到一个NPE。

    此外,你应该避免使用First(),你应该使用FirstOrDefault并且更加防御,是:检查它是否为空。

    然而,你有更多的问题,一旦你加载画廊,你可以将画廊图像添加到图像,然后调用 db.savechanges();

    【讨论】:

    • 非常感谢!删除属性解决了这个问题。我还实现了您的其他提示,尽管不需要 GUID 的 TryParse,因为我已经在我的路由配置中创建了对控制器操作的约束,它已经验证了 guid。
    猜你喜欢
    • 2013-10-26
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多