-1

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; }
}

新しいギャラリー エンティティを作成すると、画像コレクションは null になります。初期化されていないリストに新しいイメージ (私の場合) を追加するにはどうすればよいですか? 追加するための私のコードは次のようになります。

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 または daraus entfernt werden.

初期化されていないコレクションに新しいアイテムを追加するにはどうすればよいですか?

4

1 に答える 1

0

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(); を呼び出すことができます。

于 2013-08-19T19:34:38.307 に答える