问题标签 [entity-framework-6.1]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
796 浏览

entity-framework - 使用 Entity Framework CommandTree 拦截器添加额外的数据库命令

我正在尝试在实体框架中实现可审计的数据存储。我的目的是在任何给定时间点保留每条记录状态的历史记录。这要求我将所有删除语句转换为更新,并将所有更新语句转换为更新 + 插入。

我按照TechEd 2014 EF6 软删除会话视频进行拦截器的基本设置,但我已经到了不知道如何继续的地步。我有查询、删除和插入的有效案例,但更新是一个棘手的案例。

这是该方法的基本结构:

据我所知,可以修改方法中的当前ResultTreeCreated但我找不到将新命令插入上下文的方法。由于拦截器似乎只处理单行操作,我开始认为我想做的事情在TreeCreated方法中是不可能的。

有没有办法在不使用数据库触发器的情况下使用拦截器完成我想做的事情?

0 投票
1 回答
2367 浏览

c# - dotConnect:Oracle 数据库 11g 不支持 CROSS APPLY

我正在尝试使用 devart dotConnect 8.4 + EF6.1执行此代码块:

但它抛出了这个错误:

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NotSupportedException: Oracle 数据库 11g 及更低版本不支持 CROSS APPLY。正确运行此 LINQ 语句需要 Oracle 12c 或更高版本。如果您需要在 Oracle 数据库 11g 或更低版本中运行此语句,请将其重写,以便可以将其转换为 SQL,并由您使用的 Oracle 版本支持。

我正在使用: dotConnect for Oracle 8.4.171.0 + EF6.1(代码优先)+ Oracle 11g

它正在使用dotConnect for Oracle 7.5.164.0 + EF4(代码优先)+ Oracle 11g

0 投票
1 回答
316 浏览

entity-framework - EF6 - 错误?- 迁移检查项目的数据库,但写入构建的数据库

同时,我至少找到了问题的原因。如果您不想阅读我完成的所有步骤,只需向下滚动到本文末尾的 Edit1。

我目前面临 EF 6 的问题,我不知道这是设计上的错误还是我对 EF 的了解不够:(

我在一个解决方案中有3 个项目:一个服务器项目、一个客户端项目和一个模型项目。
该模型包含我的服务器和客户端的上下文类使用的实体,它们中的每一个都在我的服务器和客户端项目的命名空间中。

我的上下文类(都在模型命名空间内)包含2 个 DBSet对象:[Srv|Cli]EntityCoreEntity。两者都是我的“真实”实体继承自的抽象类,因此我不必在上下文类中定义每个实体。
结果是为从这些基类中的每一个继承的每个实体创建了一个新表,并且为这些基类中的每一个本身创建了一个名为CoreEntityRegistry[Srv|Cli]EntityRegistry的表。

我做的第一件事是启用迁移,添加初始迁移和更新数据库,没有任何问题。

比我在客户端代码和数据建模上工作,然后启用迁移并添加初始迁移。在这一点上,我不再记得是否进行了数据库更新,但我想是这样,因为如果没有,我会收到一些异常,试图访问在调试期间无法使用的数据库元素。

回到模型项目,我为服务器编辑了一些实体,我也为服务器和客户端(= Core)编辑了一些实体。

比我再次运行Add-Migration服务器项目,但这次 EF 抱怨未决迁移。实际上这是不可能的,但我想我只是Update-Database再次跑来确定。
该命令运行成功。
但是一旦我Add-Migration再次尝试:来自 EF 的相同未决错误。

查看数据库表__MigrationHistory,我可以看到我的迁移,但ContextKey设置为LRCM.Client.Migrations.Configuration,而不是LRCM.Server.Migrations.Configuration,这很可能是我仍然处于幽灵挂起状态的原因。
这是我的第一个谜团:这怎么可能?启用迁移时,我为正确的ProjectNameProjectStartUpNameContextTypeName指定了参数。甚至尝试指定ConfigurationConfigurationTypeName参数而不进行任何更改。

长话短说,我真的尝试了我能想到的一切来解决这个问题:重命名配置类名称、更改命名空间(每个上下文一个)、将 MigrationNamespace 设置为迁移配置、手动将ContextKey设置为配置等。

最后我想(项目仍处于初始状态)我只是再次删除服务器和客户端的数据库,从服务器和项目中删除所有迁移文件和文件夹,将我的上下文类放入每个相应的项目(客户端,服务器)和现在只为我的服务器启用迁移,以确保在我也为客户端项目启用迁移之前,该服务器正在工作。

跑步Add-Migration看起来很有希望,但跑步Update-Database教会了我其他东西。
现在我收到(我在上面简要介绍的测试期间也收到了)一个关于已经存在的表的错误。相关表是我的 CoreEntities 表(也由客户端上下文使用),但我的迁移文件不包含两次这样的CREATE语句。我想以某种方式迁移试图合并我的客户端和我的服务器上下文 -但为什么呢? 它们之间没有联系,只是它们共享一些实体

再次查看数据库站点,我可以看到我创建的所有表以及在 __MigrationHistory 表中 - 惊喜:仍然是相同的 ContextKey值。

这是我的第二个谜: 为什么 ContextKey 仍然是解决方案中使用的第一个?它是否缓存在某个地方?为什么迁移尝试添加我的表两次,尽管迁移文件只有一个CREATE语句?

对于一些代码示例(此处的代码功能不适合长代码输入),请参阅我昨天打开的另一个线程,但怀疑我不会在那里收到任何答案:MSDN 论坛

我真的很感激能得到任何帮助来解决这个问题。

问候,
汤姆

编辑1:
与此同时,我至少收效甚微。
我从服务器和客户端项目中删除了与迁移相关的所有内容。
在我的服务器上下文中为 CoreEntity 评论了我的 DBSet。
为服务器项目启用迁移。
成功添加了迁移文件。
成功更新数据库。
重置所有迁移内容,这次使用 CoreEntity 的上下文。
添加迁移和更新数据库再次成功。
为客户项目启用迁移。
成功添加迁移和更新数据库。

在为客户端项目启用迁移之前,我在 DB 中再次查看,这次我在__MigrationHistory中看到了两个条目。一个是旧的(错误的)ContextKey,一个是正确的。
因此,我再次删除了所有数据库并执行了Update-Database. 而这一次只有 1 个正确的条目。

但现在我又有了未决的问题。不管我多久跑一次Update-Database

这使我得出了一些我必须检查的其他结论:
如果我从项目文件夹中删除数据库文件,迁移会警告缺少数据库。但是,如果我再次将此文件添加为新数据库,它将起作用。
我看到的问题(我想我知道)是迁移更新了我的构建的AppData文件夹下的数据库,它在调试期间使用它,但检查(无论出于何种原因)在我的项目的AppData文件夹中只有一个数据库文件的数据库没有任何桌子。

我是对的,至少找到了原因
当我执行 Update-Database 时,它​​连接到构建文件夹结构中的数据库,而不是项目文件夹结构中的数据库。

所以我的最后一个问题(我也将更改标题)是: 为什么基于 EF 代码的迁移检查项目 DB 文件中的迁移,但只写入构建的 DB 文件中的 DB 文件?看起来几乎像一个错误?!

0 投票
1 回答
112 浏览

memory-management - 实体框架在发布模式下使用更多内存

我正在测试 EF5 与 EF6.1(代码优先、POCO、ProxyCreation 启用)的内存使用情况,并遇到了一些令人担忧的行为。

我的测试很简单:

1) 使用 GC.GetTotalMemory(false) 检查内存

2) 通过不同的 DataContext 运行约 20 个复杂查询,保持对所有结果的引用

3) 使用 GS.GetTotalMemory(false) 比较内存

4) 清除对所有内容的引用

5)比较内存ssing GC.GetTotalMemory(true)(强制垃圾回收

比较 (3) 到 (5) 的内存让我了解 EF 在此过程中分配了多少内存。

EF5 和 EF6.1 差别不大

然而,在 Debug 模式和 Release 模式下编译有很大的不同:

  • 调试模式:分配~150MB

  • 发布模式:~280MB 已分配

我已经验证了这些结果如下:

  • 可比较的结果出现在任务管理器(私有工作集)中

  • EF5 和 EF6.1 相同

  • 在 Visual Studio 中运行和直接运行 EXE 相同

  • 在没有其他程序运行的工作站上

  • 我的代码中没有 [if #debug] 语句

可能是什么原因,我该如何进一步调查?

0 投票
1 回答
526 浏览

c# - 实体框架连接数据库速度慢?

这需要大约 2 秒,即使数据库已经创建。有什么办法可以加快速度吗?

0 投票
4 回答
612 浏览

c# - 如何以编程方式设置数据库文件名?

按照本教程,我创建了我的DbConfiguration课程:

并告诉我DbContext使用它:

这似乎连接得很好,但我不知道它在哪里存储我的数据,我不喜欢那样。我希望它将所有内容保存到 App_Data 文件夹中的文件中。如何从ImgSigDbConfig构造函数中指定它?(假设我对 SQL 服务器连接一无所知)


做了一些更多的挖掘并想出了这个:

但现在它抛出:

提供者未返回 ProviderManifestToken 字符串


根据 haim 和 gunther 的建议,我删除了多余的连接设置:

并将它们移到 Program.cs 中:

但即便如此,我还是得到了System.Data.Entity.Core.ProviderIncompatibleExceptionInnerException:

提供程序未返回 ProviderManifestToken 字符串。

即使我设置了SetManifestTokenResolver- 我猜默认的不起作用?

0 投票
0 回答
962 浏览

c# - 实体框架 + MySQL:在没有密钥长度的密钥规范中使用 BLOB/TEXT 列“哈希”

我正在尝试将实体框架与 MySQL 一起使用。我刚刚安装了适用于 Windows 的 MySQL 安装程序,其中包括适用于 .NET 的 MySQL 连接器。

我找不到任何关于如何实际使用这个东西的文档,所以我一直在拼凑各种教程中的片段。看来我需要MySql.DataMySql.Data.Entity for EF6截图)的参考。

然后我从一些随机项目中偷了这个源代码,这是我能找到的唯一参考MySqlConnectionFactory

我无法弄清楚如何在那里设置我的数据库凭据,但显然你可以在构造时传递它们DbContext

现在我创建了一个非常简单的 POCO:

但是当它遇到db.Database.Initialize异常时会抛出:

密钥规范中使用的 BLOB/TEXT 列“哈希”没有密钥长度

这很有意义,因为在 MySQL 中,您必须为任何 blob/文本字段设置密钥长度(尽管很高兴看到它正在尝试运行什么 SQL)。

所以我的问题是:

  1. 如何将数据类型更改Hash为固定长度binary(16)
  2. 如何设置密钥长度(最好使用属性)?
0 投票
2 回答
511 浏览

c# - 将两个返回 bool 的 LINQ 查询组合成一个返回 bool?

目前,我在返回 a 的方法中有以下两个 LINQ 查询(针对 EF 6.1)bool?

第一个检查用户是否处于任何角色,如果是!IsAllowed,则返回false(=> 用户/角色被拒绝权限,这会否决任何“允许”)。然后它检查用户是否处于任何已IsAllowed设置并true在这种情况下返回的角色。如果没有为用户的任何角色设置权限,则返回null
在大多数情况下,这会导致对数据库的两次查询,因为!IsAllowed用户并不经常这样做。

有没有办法对直接返回的数据库使用一个查询bool?

0 投票
2 回答
575 浏览

entity-framework-6.1 - 实体框架级联删除,即使数据库中没有设置 CASCADE

我的数据库中的两个表 UserProducts 和 Users 之间有外键关系,其中 UserProducts 的 UserID 引用了 Users 表中的 UserID。

UserProducts 表中的 UserID 列是具有另一列 ProductID 的复合主键的一部分。还有两个额外的 DateTime 列,因此 Entity Framework 不会将 UserProducts 视为链接表。

上面的外键没有级联删除,我也没有设置任何东西来处理实体框架外键关联上的 OnDelete。然而,当我从代码中删除一个用户实体时,实体框架冒昧地删除了用户 ID 与其关联的用户产品。它还生成大量 SQL 来执行此操作:在 UserProducts 表中,每个相关记录都有一个单独的 DELETE。

执行实体删除的代码如下:

这是怎么回事?在 EF 4 中,我很确定 EF 从来没有这样做过:您必须在代码中手动加载然后删除所有相关实体。

谢谢

0 投票
1 回答
696 浏览

c# - 在 linq 查询中将枚举与字符串连接起来

我正在使用 EF Code First Approach 在 c# 中开发 WinForm 应用程序。我遇到的问题是当我执行 linq 查询时,尝试将 Enum 与字符串连接起来。错误如下:

无法将类型“Entities.VoucherType”转换为类型“System.Object”。LINQ to Entities 仅支持转换 EDM 基元或枚举类型

然后我显示枚举、POCO 实体和 linq 查询: