ASP.net MVC - 主细节 - 外键始终为零

时间:2013-01-18 13:36:13

标签: asp.net-mvc entity-framework master-detail

我是MVC的新手,并试图以主详细信息的形式添加/编辑记录。 master和detailid都是由oracle在记录插入时生成的。因此,当我尝试调用DBContext.SaveChanges()时,我得到的错误是外键被违反,并且找不到id为'0'的主行。

以下是课程说明。

public class Master
{
    public int MasterID { get; set; }
    public string MasterTitle { get; set; }
    public virtual IList<Detail> Details { get; set; }
}

public class Detail
{
    public int DetailID { get; set; }
    public int MasterID { get; set; }

    public string DetailName { get; set; }
    public virtual Master Master { get; set; }
}

控制器代码

[HttpPost]
  public ActionResult Create(MASTER masterrecord)
{
   if (ModelState.IsValid)
   {
      db.MASTER.Add(masterrecord);
      db.SaveChanges();
    }
    ...
}

只有在将记录插入数据库后,主键(masterid)才会获得有意义的值。此时,context.SaveChanges()尝试使用“0”masterid保存客户端记录。我搜索了每一个找不到任何有用的地方。

虽然首先只保存Master表,以便我可以检索masterid并使用DETAIL模型来使用它。然而无法找到使用EF5 MVC ASP.NET的任何地方 任何人都可以指出我提供一些工作样品的正确方向吗? 谢谢 Siddhant

2 个答案:

答案 0 :(得分:0)

如果您在Create方法上设置了断点并且在Master对象中获得了正确的列表,则可能是Oracle提供商的问题。

作为解决方法,您可以尝试更改方法签名以接受以下数据:

public ActionResult Create(MASTER masterrecord, List<Detail> details)

然后您可以先保存masterrecord,然后再添加您的详细信息并再次保存。它不是最佳的,但可能有效。

附注:将IList更改为ICollection。

答案 1 :(得分:0)

您可能需要考虑为PK使用GUID而不是int。然后在Master的构造函数中,您可以说MasterID = Guid.NewGuid();。这样,您无需访问数据库即可找出下一个ID。

这里有一个赞成和反对列表http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html