5

asp.net mvc 3 + EFコードを最初に勉強しています。私は両方とも初めてです。私の例は些細なことですが、それでも機能させることはできません。シンプルで明白なものが欠けています...

私はクラスを持っています:

 public class Product
 {
    [HiddenInput(DisplayValue = false)]
    public int ProductID { get; set; }

    [Required(ErrorMessage = "Please enter a product name")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a description")]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [Required]
    [Range(0.01, double.MaxValue, ErrorMessage = "Please enter a positive price")]
    public decimal Price { get; set; }

    [Required(ErrorMessage = "Please specify a category")]
    public string Category { get; set; }
}

DbContext:

public class EFDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

およびリポジトリ:

public class EFProductRepository : IProductRepository
{
    private EFDbContext context = new EFDbContext();

    public IQueryable<Product> Products
    {
        get
        {
            return context.Products;
        }
    }

    public void SaveProduct(Product product)
    {
        if (product.ProductID == 0)
            context.Products.Add(product);

        context.SaveChanges();
    }
}

mvc コントローラー:

public class AdminController : Controller
{
    private IProductRepository repository;

    public AdminController(IProductRepository repo)
    {
        repository = repo;
    }

    public ViewResult Index()
    {
        return View(repository.Products);
    }

    public ViewResult Edit(int productId)
    {
        Product product = repository.Products.FirstOrDefault(p => p.ProductID == productId);
        return View(product);
    }

    [HttpPost]
    public ActionResult Edit(Product product)
    {
        if (ModelState.IsValid)
        {
            repository.SaveProduct(product);
            TempData["message"] = string.Format("{0} has been saved", product.Name);
            return RedirectToAction("Index");
        }
        else
        {
            // there is something wrong with the data values
            return View(product);
        }
    }
}

製品のリストを表示し、編集ビューを開き、一連の属性に従ってすべてを検証します...

検証済みの変更を保存すると、Http PostEditメソッドに移動し、必要なSaveChanges().

例外はスローされず、続行され、製品のリストにリダイレクトされます。

編集された項目は変更されません。

基礎となるデータベース ( で接続されてconnectionstringsいるweb.config) も変更されません。

4

3 に答える 3

1

確かに、あなたは添付する必要があります。

Edit(1) を呼び出すとします。コントローラーは ID = 1 の Product を DB からロードし、そのプロパティ (ビューで宣言したもの) に基づいて HTML ビューを生成します。Edit(int productId) メソッドを終了し、ブラウザーにビューが表示されるとすぐに、DbContext はその ID を持つ製品を失いました。対象外になりました。その後、製品に変更を加えてフォームを送信すると、ASP MVC はフォーム フィールドに基づいて新しい製品オブジェクトをまとめて (とりわけ)、そのオブジェクトを Edit(製品製品) メソッドに渡します。これは完全に新しい Product オブジェクトであり、古い Product オブジェクトはいずれにせよスコープ外になったため、DbContext には、新しい Product が DB にどのように関連するのかわかりません。つまり、新しいオブジェクトなのか、既存のオブジェクトなのか、存在する場合、変更はありますか?Product オブジェクトをアタッチし、その状態を変更済みに設定すると、DbContext は変更されたプロパティのチェックを開始できます。

于 2012-08-21T08:33:35.663 に答える