0

我是 MVC 新手,正在尝试以主详细信息形式添加/编辑记录。masterid 和 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 来做这件事 任何人都可以指出我提供一些工作示例的正确方向吗?谢谢悉达特

4

2 回答 2

0

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

作为一种解决方法,您可以尝试更改方法签名以接受您的数据,如下所示:

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

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

旁注:将您的 IList 更改为 ICollection。

于 2013-01-18T15:52:41.663 回答
0

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

这里有一个优缺点列表http://www.codinghorror.com/blog/2007/03/primary-keys-ids-versus-guids.html

于 2013-01-19T00:12:08.037 回答