【发布时间】:2015-12-31 10:52:57
【问题描述】:
EF6.
我有一个项目首先使用 EF6 数据库。
我的数据库表有 6 列的唯一键。在项目中一切都运行良好。然后我意识到唯一键不正确,我不需要它,所以我从数据库中删除了它。
我有一个Product,其中包含一个ICollection<ProdPrice> ProdPrices。
现在,当我使用 Product product = db.Products.Find(id); 时,我得到了一个产品,但 ProdPrices 集合只包含 6 个项目,而它应该包含 12 个项目。(前 6 个项目在列表中)。
如果我从数据库中删除第一个项目并再次运行代码,则返回 6 个项目 - 项目 2 - 7。
如果我更改列中的一个值,该列中曾在唯一键中,该项目将出现在代码中。
所以我认为 EF 以某种方式记住唯一键,并且只返回与唯一键不冲突的第一个项目。
我尝试在 edml 文件中“从数据库更新模型” - 没有解决问题。所以我从 edml 中删除了 ProdPrice 表,并且“从数据库更新模型” - 没有用。
所以我的问题是 - 我是否正确地说 EF 正在记住已删除的唯一密钥?如果是,我如何让它忘记它?如果我不正确,那么您能解释一下实际发生的情况吗?
编辑:调用数据库生成的 SQL - 在 SSMS 中运行时返回所有 12 条记录的标准选择语句(为了便于阅读,删除了列):
SELECT
[Extent1].[ProdPriceID] AS [ProdPriceID],
[Extent1].[ProdID] AS [ProdID],
[Extent1].[PermanentlyDelete] AS [PermanentlyDelete],
[Extent1].[DateCreated] AS [DateCreated]
FROM [dbo].[ProdPrice] AS [Extent1]
WHERE [Extent1].[ProdID] = 67577
这是结果,您可以看到我得到了 12 条记录。
代码结果:
所以我决定只询问产品的价格 - 我得到 12 个结果,这真的让我很困惑:
编辑: 我以为我已经解决了... 为了解决(并进一步测试),我决定在数据库中重新创建 ProdPrice 表 - 我通过使用 MSSSMS 生成脚本并包含数据来做到这一点,因此我拥有该表的精确副本,称为 ProdPrice2。
我的系统中有 ProdPrice 和 ProdPrice2 实体(这确认我仍然连接到正确的数据库)。 ProdPrice 仍然只返回与原始唯一索引不冲突的记录。 ProdPrice2 - 返回所有记录!
哎呀,原来如此 - 然后我从系统中删除了 ProdPrice,留下了 ProdPrice2 - 我运行了系统,ProdPrice2 现在只有 6 条记录,而不是我之前的 12 条!
我重新添加了 ProdPrice。ProdPrice2 仍然有 6 条记录,ProdPrice 现在有所有预期的记录。
我被难住了!!!!这真的阻碍了我的发展!在解决此问题之前我无法继续!
【问题讨论】:
-
所以我从 edml 中删除了 ProdPrice 表和“从数据库更新模型” - 没用 什么没用?
ProdPrice表是否没有重新输入到类模型中。它有和以前一样的钥匙吗?如果是后者,我怀疑您只是针对错误的数据库进行了更新。检查 edmx 项目中的连接字符串。 -
@GertArnold 我想我应该说“没有解决问题”而不是“没有用”,我已经更新了我的问题。这不是连接字符串问题。我在测试期间添加了更多表格,这些更改反映在我的项目中。谢谢。
标签: c# entity-framework