我有点……奇怪的问题。保存与另一个实体具有 * 到 1 关系的新创建实体时出现错误。有点难以解释,但这是设置:
(注意:我使用的是 MVC 2 - 实体框架 4)
我的实体设置如下(为了可读性而替换了名称,但结构如所述): 我们公司有一些经理。(tblManagers) 每个经理拥有未定义数量的 Store (tblStores)。每个商店都有未定义数量的设备 (tblEquipment)。所以我的数据模型如下:
(tblManagers) 1<----->* (tblStores) 1<----->* (tblEquipment)
这个设置是有效的,因为我们已经有很多数据(来自导出旧的 Access 文件)。
在创建新设备时,您显然必须选择它所属的商店。将下拉列表中选择的值(Store 的 ID)传递给 HttpPost 方法,该方法执行以下代码:
db 是我的数据库上下文变量
myNewItem.tblStore = db.tblStores.Single(x => x.Id == store_id_from_dropdown);
db.tblEquipments.AddObject(myNewItem);
db.SaveChanges();
在我看来,这似乎是有效的代码。Resharper 没有发现任何问题,也没有编译错误(甚至警告)。但是,在运行代码时,我遇到了以下异常(在 db.SaveChanges() 上抛出):
Entities in 'CMT_DevEntities.tbl_Stores' participate
in the 'tblManagerstblStores' relationship.
0 related 'tblManager' were found.
1 'tblManager' is expected.
我不知道为什么它甚至在看 tblManager 因为在我的代码中没有引用它。我知道这与经理和他们的商店之间的关系有关,但我不明白为什么。
这是让我感到困惑的部分:
- 查看 的调试值时
myNewItem
,我可以看到商店已添加到实体中。我什至可以检查 Store 的 tblManager 属性,它是正确的 tblManager。因此,这确认了数据库中的一切正常(如果没有经理,商店甚至都不存在)。 - 我实际上遗漏了一些代码。设备中有一个完全相似的导航属性(假设是供应商。供应商又具有国家/地区的导航属性。关系完全相同)。我没有得到这个错误。只有商店/经理之一。
我可能遗漏了一些东西,也许是一些非常简单的东西。无论哪种方式,我都不知道为什么会这样。
所以我的问题是:给定由 MVC 中的 ModelBinder 创建的实体和导航属性的 (int) ID,我如何将新实体添加到数据库中?