0

私のコントローラーでは、サブカテゴリオブジェクトを作成し、そのオブジェクトに、それが属するカテゴリへの参照を与えています。サイトをデバッグするときはすべて正常に機能しますが、entityframeworkデータベースからオブジェクトのリストを読み込むと、すべてのカテゴリオブジェクト参照が削除されます。残りは持続します。なぜこれが起こるのか誰かが知っていますか?

コントローラ:

[Authorize(Roles = "administrator")]
    [HttpPost]
    public ActionResult Create(CategoryViewModel viewmodel, HttpPostedFileBase Icon)
    {
        SubCategory subcategory = new SubCategory();
        Category category = categorycontroller.getCategoryByName(viewmodel.SelectedValue);

        viewmodel.subcategory.Category = category;
        subcategory = viewmodel.subcategory;
        category.Subcategories.Add(subcategory);

        if (Icon != null && Icon.ContentLength > 0)
        {
            var fileName = Path.GetFileName(Icon.FileName);

            var path = Path.Combine(Server.MapPath("../../Content/icons/"), fileName);
            Icon.SaveAs(path);
            subcategory.Icon = fileName;
        }

        if (ModelState.IsValid)
        {
            subcategorydb.categories.Attach(category);
            subcategorydb.subcategories.Add(subcategory);
            subcategorydb.SaveChanges();
            return RedirectToAction("Index");  
        }

        return View(subcategory);
    }

これが私のビューモデルです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using System.Web.Mvc;
using SkyLearn.Areas.Categories.Controllers;

namespace SkyLearn.Areas.Categories.Models
{
    public class CategoryViewModel
    {
        public List<SelectListItem> PossibleValues { get; set; }
        public string SelectedValue { get; set; }
        public SubCategory subcategory { get; set; }

        public CategoryController categorycontroller;

        public CategoryViewModel()
        {
            PossibleValues = new List<SelectListItem>();
        }
    }
}

そして、これが私のカテゴリとサブカテゴリのクラスです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace SkyLearn.Areas.Categories.Models
{
    public class Category
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Icon { get; set; }
        public string Description { get; set; }
        public List<SubCategory> Subcategories;

        public Category()
        {
            Subcategories = new List<SubCategory>();
        }
    }

    public class CategoryDBContext : DbContext
    {
        public DbSet<Category> categories { get; set; }
        public DbSet<SubCategory> subcategories { get; set; }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;
using SkyLearn.Areas.Categories.Controllers;

namespace SkyLearn.Areas.Categories.Models
{
    public class SubCategory
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Icon { get; set; }
        public string Description { get; set; }
        public int CategoryID { get; set; }
        public Category Category { get; set; }
    }

    public class SubCategoryDBContext : DbContext
    {
        public DbSet<SubCategory> subcategories { get; set; }
        public DbSet<Category> categories { get; set; }
    }
}

私はこの問題に関する情報を多くのサイトで検索しましたが、多くの助けを見つけることができませんでした。ここで私の問題を特定できる人はいますか?

このスクリーンショットに見られるように、オブジェクトは必ず正しく参照されています。しかし、次にオブジェクト参照が消えたときにデータをロードするとき。他のすべての属性は引き続き存在し、必要に応じて保存されます。 保存プロセスのデバッグを表示する画像

ありがとうAronChan

////更新////次のエラーが発生します:

対応する主キー値が存在しないため、外部キー値を挿入できません。[外部キー制約名=SubCategory_Category]

4

1 に答える 1

2

サブカテゴリを追加する DbContext にアタッチされていないため、カテゴリ オブジェクトは保存されません。サブカテゴリは参照について知っているかもしれませんが、カテゴリは知りません。ルックアップ テーブルがある場合 (多対多の場合は存在する必要があります)、そのレコードがどのように保存されるかわかりません。カテゴリを添付し、サブカテゴリを追加してから保存してみてください。個人的には、常に多対多のルックアップ テーブルを独自のエンティティとして設定してきました。すべての制御を EF に任せるよりも、実際に何が起こっているかを視覚化する方が少し簡単です。

また、最初にコードを使用している場合は、EntityConfigurations が正しいことを確認してください。コンテキストで EdmxWriter を実行して、データ モデルが意図したとおりに表示されることを確認してください。

于 2012-05-02T14:01:30.450 に答える