c# - Entity Framework Database First 是否知道数据库中设置的唯一键?

标签 c# entity-framework

EF6。

我有一个首先使用 EF6 数据库的项目。

我的数据库表 6 列的唯一键。该项目一切顺利。然后我意识到唯一 key 不正确并且我不需要它,因此我将其从数据库中删除了。

我有一个Product其中包含 ICollection<ProdPrice> ProdPrices .

现在,当我使用Product product = db.Products.Find(id);时我得到了一个产品,但 ProdPrices 集合只包含 6 个项目,而它应该包含 12 个项目。(前 6 个项目位于列表中)。

如果我从数据库中删除第一个项目并再次运行代码,则会返回 6 个项目 - 项目 2 - 7。

如果我更改唯一键中曾经的列中的某个值,则该项目将出现在代码中。

所以我认为 EF 会以某种方式记住唯一键,并且只返回与唯一键不冲突的第一个项目。

我尝试在 edml 文件中“从数据库更新模型” - 没有解决问题。因此,我从 edml 中删除了 ProdPrice 表,并且“从数据库更新模型” - 不起作用。

所以我的问题是 - 我所说的 EF 记住已删除的唯一键是否正确?如果是的话,我该如何让它忘记它?如果我错了,那么你能解释一下到底发生了什么吗?

编辑:通过调用数据库生成的 SQL - 标准 select 语句,在 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 条记录。

SSMS Results

代码结果:

Code Result

所以我决定只请求产品的价格 - 我得到 12 个结果,这真的让我很困惑:

Prices only

编辑: 我以为我已经解决了... 为了解决(并进一步测试),我决定在数据库中重新创建 ProdPrice 表 - 我通过使用 MSSSMS 生成脚本并包含数据来做到这一点,这样我就有了该表的精确副本,将其称为 ProdPrice2。

我的系统中有 ProdPrice 和 ProdPrice2 实体(这证实我仍然连接到正确的数据库)。 ProdPrice仍然只返回与原始唯一索引不冲突的记录。 ProdPrice2 - 返回所有记录!

哎呀,以为就是这样 - 然后我从系统中删除了 ProdPrice,留下 ProdPrice2 - 我运行了系统,ProdPrice2 现在只有 6 条记录,而不是我之前的 12 条!

我重新添加了 ProdPrice。ProdPrice2 仍然有 6 条记录,ProdPrice 现在拥有所有预期的记录。

我被难住了!!!这真的阻碍了我的发展!在解决此问题之前我无法继续!

最佳答案

经过几天的努力,以及 @AlbertoMonteiro 提供的一些出色的帮助和建议,我无法获得我预期的行为。

在继续尝试各种事情和调试之后,我最终遇到了一些我忘记了的代码......!

原来问题的答案

Does Entity Framework Database First know about unique keys set in the database?

是,没有 Entity Framework 数据库首先不知道数据库中设置的唯一键。

但是,EF 在创建实体列表时会使用任何重写的 Equals() 函数。在我的代码中,我重写了 Equals 函数来模仿数据库中的唯一键,这意味着当我添加到价格列表时,我可以匹配“重复项”并将它们合并在一起。由于我已经更改了系统的工作方式,此代码导致我的价格列表未完全填充。

答案是我是个白痴,我应该记住我写的代码。我将把这个问题留在这里,因为它可能会阻止有人在未来失去几天的发展。

关于c# - Entity Framework Database First 是否知道数据库中设置的唯一键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34545327/

相关文章:

c# - 如何在 asp.net 中显示 html 电子邮件

c# - 我们如何访问和调用 Visual Studio API/函数,例如 "Find in All Files"。?

c# - 在 asp.net c# 中为菜单项动态设置 NavigateUrl

c# - 使用 While() 结构时 Gridview 不会填充。 C# ASP.NET

sql - 将SQL语句转换为Linq语句(3表左连接+where)

visual-studio-2008 - 如何在 Visual Studio 中对 Entity Framework 数据库模型的表进行排序(排列)?

c# - Entity Framework 4.1 - 如何将 "Force"EF 转至 DB 而不是使用 Graph?

c# - 动态构建 Linq Lambda 表达式

WPF ViewModel 与否 ViewModel

c# - MySQL Entity Framework 迁移