编辑和删除操作复合主键问题

时间:2014-05-10 23:52:39

标签: c# asp.net-mvc entity-framework asp.net-mvc-4 razor

这是我的编辑控制器:

public ActionResult Edit(short id)
{
    TAUX taux = db.TAUX.Find(id);
    if (taux == null)
    {
        return HttpNotFound();
    }
    ViewBag.CAT_ID = new SelectList(db.CATEGORIE, "CAT_ID", "LIBELLE", taux.CAT_ID);
    ViewBag.C_GARANT = new SelectList(db.GARANTIE, "C_GARANT", "LIB_ABREGE", taux.C_GARANT);
    return PartialView("_Edit",taux);
}

这就是我在观点中称之为的方式:

@Html.ActionLink("Modifier", "Edit", new {  id=d.TAUX_ID })

我的模型Taux

public partial class TAUX
{
    // the first 3 attributes are my primary key
    public short CAT_ID { get; set; } // foreign key
    public int C_GARANT { get; set; } // foreign key 
    public int TAUX_ID { get; set; }  

    [Required(ErrorMessage = "Taux est obligatoire")]
    public decimal POURC_TAUX { get; set; }
    public System.DateTime DATE_EFFET { get; set; }


    public virtual CATEGORIE CATEGORIE { get; set; }
    public virtual GARANTIE GARANTIE { get; set; }
}

这就是我得到的错误:

  

system.ArgumentException:必须传递的主键值的数量   匹配实体上定义的主键值的数量。

所以我试着这样做:

public ActionResult Edit(int taux_id ,int c_garant, short cat_id)
{
TAUX taux = db.TAUX.Find(taux_id, c_garant, cat_id); 
... }
//////////
@Html.ActionLink("Modifier", "Edit", new {  id=d.TAUX_ID, c_garant=d.C_GARANT, cat_id=d.CAT_ID })

但我遇到了这个问题:

  

参数字典包含参数的空条目   ' taux_id'非可空类型的System.Int32'方法   ' System.Web.Mvc.ActionResult编辑(Int32,Int32,Int16)'在   ' pfebs0.Controllers.TauxController&#39 ;.可选参数必须是a   引用类型,可空类型,或声明为可选   参数。

如何解决(deleteAction的相同问题)?

3 个答案:

答案 0 :(得分:2)

如果我理解你的问题。这三个属性是您的密钥,但不是您的主键,因为我在您的代码中看到您只是添加了注释,以确保CAT_IDC_GARANT是您的外键。 关于第一次尝试。仅含义Taux_ID是您的主键。 如果您希望扩展方法Find正常工作,则需要精确定位属性Key,该属性位于表中属性的主键上。 在你的情况下,你可以:

修改

  public partial class TAUX
 {
    public int TAUX_ID { get; set; }  

    [Required(ErrorMessage = "Taux est obligatoire")]
    public decimal POURC_TAUX { get; set; }
    public System.DateTime DATE_EFFET { get; set; }

    public short CAT_ID { get; set; } // foreign key
    public virtual CATEGORIE CATEGORIE { get; set; }
    public int C_GARANT { get; set; } // foreign key 
    public virtual GARANTIE GARANTIE { get; set; }
   }

然后在你的行动中,不要改变:

    public ActionResult Edit(int id=0, int cat_Id =0,short c_garant=0)
   {
    TAUX taux = db.TAUX.Where(p=>p.TAUX_Id==id &&p.CAT_ID==cat_Id && p.C_GARANT==c_garant).FirstOrDefault();
    if (taux == null)
    {
        return HttpNotFound();
    }
    ViewBag.CAT_ID = new SelectList(db.CATEGORIE, "CAT_ID", "LIBELLE", taux.CAT_ID);
    ViewBag.C_GARANT = new SelectList(db.GARANTIE, "C_GARANT", "LIB_ABREGE", taux.C_GARANT);
    return PartialView("_Edit",taux);
    }

答案 1 :(得分:1)

最简单的尝试是改变

public ActionResult Edit(int taux_id ,int c_garant, short cat_id)

public ActionResult Edit(int id ,int c_garant, short cat_id)

并离开

@Html.ActionLink("Modifier", "Edit", new {  id=d.TAUX_ID, c_garant=d.C_GARANT, cat_id=d.CAT_ID })

现在

答案 2 :(得分:0)

您在ActionLink中传递的路线值需要与操作方法中的参数名称相匹配。

将您的ActionLink更改为:

@Html.ActionLink("Modifier", "Edit", new { taux_id=d.TAUX_ID, c_garant=d.C_GARANT, cat_id=d.CAT_ID })