【发布时间】:2012-07-24 22:47:40
【问题描述】:
我有点……奇怪的问题。保存与另一个实体具有 * 到 1 关系的新创建实体时出现错误。有点难以解释,但设置如下:
(注意:我使用的是 MVC 2 - 实体框架 4)
我的实体设置如下(为了便于阅读,替换了名称,但结构如所述): 我们公司有一些经理。 (tblManagers) 每个经理拥有未定义数量的 Stores (tblStores)。每个商店都有未定义数量的设备 (tblEquipment)。 所以我的DataModel如下:
(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,我如何将新实体添加到数据库中?
【问题讨论】:
-
不确定 EF,我认为是 4 - 然后先找出来。
-
确认是 4。更新帖子。
-
db.tblStores.Single(...)和db.tblEquipments.AddObject(...)真的发生在db的同一个实例上吗? -
代码是精确的复制粘贴。该函数只有一个 using(var db = ....) 块,上面的 sn-p 是 using() 块的内容。
-
如果你使用
db.tblStores.Include("tblManager").Single(...)会发生什么?那么错误会消失吗?
标签: c# asp.net-mvc-2 entity-framework-4