我是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
答案 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