0

多対多のコンテキストを実現しようとしています。製品はさまざまな素材で作ることができ、素材ごとに価格が異なります。

ここにproduct.csがあります:

namespace test.Models
{
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Web.Mvc;
    using System;
    using System.Collections.Generic;
    public partial class Product
    {
        public Product()
        {
            this.ProductMaterials = new HashSet<ProductMaterial>();
        }
        public int Id { get; set; }
        [DisplayName("Product name"),
          Required(ErrorMessage = "Product Name is required"),
          StringLength(100)]
        public string Name { get; set; }
        [Required]
        public virtual ICollection<ProductMaterial> ProductMaterials { get; set; }
    }
}

ProductMaterials.cs は次のとおりです。

namespace test.Models
{
    using System;
    using System.Collections.Generic;

    public partial class ProductMaterial
    {
        public int Id { get; set; }
        public int ProductId { get; set; }
        public int MaterialId { get; set; }
        public string PriceOffset { get; set; }

        public virtual Material Material { get; set; }
        public virtual Product Product { get; set; }
    }
}

そして Material.cs:

namespace test.Models
{
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Web.Mvc;
    using System;
    using System.Collections.Generic;

    public partial class Material
    {
        public Material()
        {
            this.ProductMaterials = new HashSet<ProductMaterial>();
        }

        public int Id { get; set; }
        [Required,DisplayName("Material"),
          StringLength(100)]
        public string Mat { get; set; }
        [DefaultValue(0), Required]
        public decimal PriceOffset { get; set; }

        public virtual ICollection<ProductMaterial> ProductMaterials { get; set; }
    }
}

フォームからオブジェクトを作成できるように、コンテキストに適切な情報を追加しようとしています。これをできるだけ簡単にして、小さなステップでこれを理解できるようにします。

testContext.cs には次のものがあります。

System.Data.Entity の使用;

namespace test.Models
{
    public class testContext : DbContext
    {
System.Data.Entity.DropCreateDatabaseIfModelChanges<test.Models.testContext>());
        public testContext() : base("name=testContext")
        {
        }
        public DbSet<Product> Products { get; set; }
        public DbSet<Manufacturer> Manufacturers { get; set; }
        public DbSet<ProductMaterial> ProductMaterials { get; set; }
        public DbSet<Material> Materials { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        modelBuilder.Entity<Product>()
            .HasMany(c => c.ProductMaterials);
        }    
    }
}

これは私が投稿した余分なデータです:

<input type="text" value="1" name="ProductId">
<input type="text" value="1" name="MaterialId">
<input type="text" value="0" name="PriceOffset">

コントローラーにブレークポイントを設定すると、Product オブジェクトが 0 ProductMaterials オブジェクトで作成されていることがわかります。

これが正しい方法であるかどうかはわかりませんが、ダウンロードしたサンプルコードを見ると、更新がはるかに複雑になることがわかります。

4

1 に答える 1

0

マテリアルを追加して新しい製品を作成する方法をあきらめる。編集製品で動作するようになりました。

global.asax.cs にルートを追加しました。

    routes.MapRoute(
        "Materials For Product", // Route name
        "Materials/{action}/{ProductId}/{MaterialId}", // URL with parameters
        new { controller = "ProductMaterial", action = "Index",
              ProductId = UrlParameter.Optional,
              MaterialId = UrlParameter.Optional
        } // Parameter defaults
    );

ProductMaterialController.cs の Index、create、delete を変更

public ViewResult Index(int ProductId)
{
    var productmaterialss = db.ProductMaterials.Include(p => p.Material).Include(p => p.Product).Where(
        p => p.ProductId == ProductId);
    Product pr = db.Products.Find(ProductId);
    ViewData["ProductId"] = ProductId;
    ViewData["ProductName"] = pr.Name;
    return View(productcolors.ToList());
}
public ActionResult Create(int ProductId)
{
    Product p = db.Products.Where(i => i.Id == ProductId).Single();
    ViewBag.MaterialId = new SelectList(db.Materials, "Id", "Mat");
    ViewData["ProductName"] = p.Name;
    ViewData["ProductId"] = p.Id;
    return View();
}
[HttpPost]
public ActionResult Create(ProductMaterial productmaterial)
{
    if (ModelState.IsValid)
    {
        db.ProductMaterials.Add(productmaterial);
        db.SaveChanges();
        return RedirectToAction("Index/"+productmaterial.ProductId);
    }
    Product p = db.Products.Where(i => i.Id == productmaterial.ProductId).Single();
    ViewBag.MaterialId = new SelectList(db.Materials, "Id", "Mat");
    ViewData["ProductName"] = p.Name;
    ViewData["ProductId"] = p.Id;
    return View();
}
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{
    ProductMaterial productmaterial = db.ProductMaterials.Find(id);
    int ProductId = productcolor.ProductId;
    db.ProductMaterials.Remove(productmaterial);
    db.SaveChanges();
    return RedirectToAction("Index/"+ProductId);
}

ProductMaterial ビューでモデル ダイアログを開くように Product の編集ビューを変更し、すべての ProductMaterial ビュー (他は使用されていないためインデックスと削除のみ) を変更して、テンプレートを含めずに製品名を表示するようにしました。

必要な情報を ajax 送信し、モーダル ダイアログの innerHTML を応答でリセットするために、すべてのリンクとフォームで Modal および添付イベント リスナーを開くスクリプトを製品に追加しました。

于 2013-04-01T03:57:29.600 に答える