【问题标题】:ASP.net MVC - Master Detail - foreign key is always zeroASP.net MVC - Master Detail - 外键始终为零
【发布时间】:2013-01-02 05:34:42
【问题描述】:

我是 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 任何人都可以指出我提供一些工作样本的正确方向吗? 谢谢 悉达特

【问题讨论】:

  • 使用 sqlexpress 工作正常
  • 我正在使用 Oracle。如果 PK COLUMN(在我的示例中为 MASTERID)是 = 0,则 PK 是从我使用的行前插入触发器加上检查条件的序列生成

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


【解决方案1】:

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

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

【讨论】:

  • 谢谢。使用 GUID 似乎是转发我的应用程序的正确方法。我不担心 oracle 中使用 GUID 的性能,因为我预计每年不会超过几千条记录。
  • 但是,MVC/EF5 应该有一些方法来处理这种情况,你不这么认为吗?
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 2012-05-27
    • 1970-01-01
    • 2021-10-24
    • 2017-10-29
    • 1970-01-01
    • 2018-03-20
    相关资源
    最近更新 更多