问题标签 [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.
c# - Entity Framework 6.1 Code First TPH/TPT 混合映射问题
我有一个模型,其中大多数实体都继承了相同的基本功能。该功能被封装在一个抽象基类中。除此之外,还有两个功能分支,因此有两个抽象类继承自抽象基类。此时,具体类继承自它们各自的中间抽象类。
下面是此类模型模型的一个分支的类和 EF 映射示例:
我遇到问题的地方是表映射。虽然 mapping Intermediate
、Concrete1
和Concrete2
确实生成了一个数据库——甚至给了我一个鉴别器列——它并没有像 TPH 映射所要求的那样使列可以为空,因此我最终得到以下异常消息:
(28,10):错误 3023:从第 28 行开始映射片段时出现问题:必须映射表 Concretes 中的列 Concretes.Concrete1Integer:它没有默认值且不可为空。
我已经尝试了几种排列方式-
- 仅映射
Intermediate
到自定义表格,但具体类型的字段映射到“基础”表格。 - 映射
Intermediate
到自己的表和Concrete1
&Concrete2
到名为“Concretes”的表 - 与上面代码示例中的原始映射完全相同的问题。 - 将每个实体映射到它自己的表 - 这行得通,但它纯粹是 TPT,这不是我想要的。
- 什么都不映射——这会将所有内容都放在“Bases”表中,并且纯粹是 TPH,这实际上会导致表的宽度和稀疏度令人无法接受。
是否没有某种方法可以获取我在代码示例中寻找的映射?也就是使用鉴别器的“Bases”表和“Concretes”表?
asp.net-identity - 将 SimpleMembership 数据库迁移到 Identity 2 后,User.IsInRole 失败
我成功地将我的应用程序从 MVC4-EF5 更新到 MVC5-EF6。
然后我将我的数据库从 Simplemebership 迁移到 Identity 2.0。
我可以登录,但 User.IsInRole 总是返回 false。所有正确的表 AspNetUsers、AspNetRoles、AspNetUserRoles、AspNetLogins 和 AspNetClaims 都已创建,所有列的拼写和类型都正确,并且已使用 SimpleMembership 表中的数据(已删除)填充它们。
我有一个用户“MyUser”,它在 AspNetUsers 表中的 Id = 2 和一个角色“XYZ”,它在 AspNetRoles 表中的 Id = 2,用户 2 映射到 AspNetUserRoles 表中的角色 2。
以“我的用户”身份登录时
var user = _db.Users.SingleOrDefault(u => u.UserName == User.Identity.Name);
用户确实设置为“MyUser”,但
User.IsInRole("XYZ")
返回假。
我添加了一个测试变量 ,
var testrole = Roles.GetRolesForUser();
当在调试中检查 testrole 时,它返回一个空字符串数组 {string[0]}。User.IsInRole("XYZ")
从立即窗口运行返回 false。
我已经阅读了我可以找到的关于 Identity、Identity 2.0 以及从 SimpleMembership 和 Identity 1.0 迁移的所有文档,但我找不到任何实现要求(除了我在发布的代码中所做的),我错过了制作 Identity工作(从那时起它就在某种程度上工作了登录工作)。
我已经使用 Identity 2.0 的可扩展性挂钩来为我的主键实现 INT。
WebSecConfig.cs:(从 Global.asax.cs 调用)(删除了更新代码:1)
应用用户:
身份数据库上下文:
账户控制人:
家庭控制器:
迁移脚本:(以SimpleMembershipToIdentityMigration.sql为模型,针对 Identity 2.0 和 INT 主键进行了修改)
我是否错过了配置 Identity 2.0 的内容,或者这是 Identity 2.0 中的错误?
更新 1:
删除了对 WebSecConfig 的 Global.asax.cs 调用。这掩盖了一个不同的问题User.IsInRole.
在主控制器用户路由操作中的 var 用户上设置断点
在调试中运行应用程序并以“MyUser”身份登录。
介入并将用户设置为“MyUser”。
进入 var testrole 并抛出'Object reference not set to an instance of an object.'
重新启动并以“MyUser”身份再次登录。
介入并将用户设置为“MyUser”。
从即时窗口输入User.IsInRole("XYZ")
并返回:
并打开一个警告对话框:
我的基本数据库设置是正确的,否则我将无法登录。这让我相信我运行迁移的方式存在细微差异。有谁知道我在哪里绊倒了。
更新 2: 我重构了代码和迁移脚本以使用默认的 nvarchar 作为主键,并得到与更新 1 相同的结果。
更新 3:
网络配置:
<remove name="RoleManager" />
作为MVC4-MVC5迁移的一部分,我需要添加到节点,我现在已经完成了。
现在我回到我原来的问题。User.IsInRole 始终返回 false。如果我User.IsAuthenticated
从立即窗口运行它会返回
我能够让 Identity.UserManager.IsInRole 工作。
Home Controller:(修改为使用 UserManager)
这表明我的数据库迁移是正确的。
我在我的应用程序的控制器、视图、自定义属性、方法和类中对 User.IsInRole 进行了数十次调用。据我了解,User.IsInRole 仍然是 MVC5-EF6 中的有效方法。如果它仍然被认为是一种有效的方法,而不是必须对这个遗留应用程序进行重大重构,我再次提出我最初的问题“为什么在 SimpleMembership 到 Identity 2.0 迁移后 User.IsInRole 失败”?
我已经在 Identity 1.0 MVC 应用程序中测试了 User.IsInRole 并且它可以工作。我将应用程序更新到 Identity 2.0,它仍然可以工作。所以我认为可以肯定地说,Identity 2.0 支持 User.IsInRole。
c# - DbSet 的 Find 方法为什么没有进入数据库以获取在 Seeding 方法期间插入的值
我有一个简单的种子方法:
这已经运行了几次,但从那以后我将数据库初始化程序设置为 Null os,它不再使用。
该项目是一个控制台应用程序,只有这行代码:
SQL 探查器不返回任何内容。
但是,如果我使用 SingleOrDefault,我会在 SQL 分析器中看到 SELECT。
我知道 Find 方法首先进入本地内存,但由于未调用 Seed 方法并且仅为两行代码创建上下文,它不应该在内存中。
为什么我在 SQL 分析器中没有看到使用 Find 方法的查询?
c# - EF 6 Code First Generate Views Null 错误
我正在尝试生成视图,因为使用 Code First 的性能在缓存之前非常慢。第一次加载网页需要大约 10 秒,直到它缓存。不幸的是,当我右键单击上下文对象并尝试生成视图时出现错误。我得到的错误是“对象引用未设置为对象的实例”。我想我错过了一些东西。这是我的上下文代码,如果您也想查看我的实体,请告诉我:
unit-testing - 使用 Identity 2.0 数据库进行 Moq 模拟
我在 MVC 5、Entity Framework 6 应用程序中成功地使用 Moq 模拟对我的 BusAct 控制器进行了集成测试,该应用程序基于一个简单的成员资格数据库。但现在我已将数据库迁移到 Identity 2.0 并将 UserProfile 替换为 ApplicationUser。
IdentityDbContext:(修改自简单成员 DbContext)
模拟数据库设置:
集成测试:
当我现在运行测试时,出现以下错误:
我相信我需要修改 MockDbSetup 但无法找到有关如何执行此操作的任何信息。
我尝试添加
但我收到“无法解决”错误GetEnumerator
也没有
或者
有效,因为它无法解决AspNetUsers
or ApplicationUser
。
有没有人知道如何做到这一点,关于模拟 Identity 2.0 数据库的文档的链接会特别有用吗?
c# - 如何在 Code First 程序集中嵌入 EDMX?
我们在 EF6.1 中使用 Code First - 我们的模型现在有 300 多个表,而且启动时间很荒谬。我们已经尝试过预生成视图,但并没有太大帮助,大部分时间是 Code First 管道中的模型编译。
我们将尝试使用数据库/模型优先的方法来初始化上下文,方法是使用带有指向 CSDL、SSDL 和 MDL 文件的元数据链接的实体连接字符串,而不是直接的 SQL 连接。这将是我们理想的过程:
- 编译包含 Code First 模型的项目后,将运行一个构建后任务,该任务从我们的 DbContext 生成一个 EDMX 文件,将其拆分为组件 CSDL、SSDL 和 MDL 文件,并将这些文件作为资源嵌入到程序集中
- 当我们通过自己的工厂创建上下文时,我们将原始 SQL 连接字符串包装在 EntityConnectionStringBuilder 中,其中 Metadata 属性指向嵌入式资源,并使用构建器连接字符串来初始化 DbContext
初始测试显示启动时间缩短了约 80% - 这里的棘手部分是在步骤 1 中进行构建后资源嵌入!
任何人都可以提供有关如何在 MSBuild 中完成第 1 步的任何线索吗?是否有其他可行的策略?基本上,我们想要一个零维护的解决方案,这样开发人员除了构建他们的代码之外不必手动做任何事情,也没有特殊的部署考虑。
编辑:
我们最终使用了一个新的、单独的类库项目,该项目引用了包含 Code First 模型的项目。该项目包含一个 T4 模板,它将 DbContext 中的 EDMX 写入内存,然后将组件部分保存到已标记为嵌入式资源的项目文件中,因此我们也获得了源代码控制。
构建顺序保证资源始终是最新的,并且实体连接字符串在运行时引用此资源程序集。MSBuild 集成是通过使用 T4 MSBuild 集成目标完成的,因此模板始终在项目构建期间运行。
c# - DBSet.Where(...).Delete() -> “没有匹配元素”这是不正确的
我正在使用带有EF.Extended的 EF 6.1,我正在尝试执行以下操作:
allRevisions
是DbSet<Revision>
我当前的一个DbContext
(此代码位于通用辅助方法中)。
当我执行此操作时,出现以下异常:
序列不包含匹配元素。
这是不正确的,因为存在匹配的修订版,并且Any
也是正确的。
此外,如果我执行以下操作,它工作正常:
但这正是使用 EF.Extended 应该能够避免的方式。
我做错了什么还是这是 EF.Extended 中的错误?
PS:我知道这Any
是毫无意义的 - 我补充说,在我第一次收到错误后,有一些修订要删除。也没有竞争条件,因为在我的开发机器上没有其他人在访问数据库。
Better to materialize the query then check if it has items and delete those you need to delete all in memory.
=> 但这正是我想要避免的(以及 EF.Extened 的优点)。我实际上不在乎是否发生了变化——我希望它只是像DELETE from Revisions WHERE Item_Id = @Id;
在数据库中那样执行查询。
更新:
我创建了一个小型演示项目来重现问题:这里
似乎与继承有关。如果我尝试用ContentRevision
它做同样的事情,但MyRevision
它继承自它,它不会。
c# - 查找不适用于 EF6.1 模拟的方法
我已经使用这些 msdn 指南设置了模拟:
返回一个帐户,但
模拟时返回 null。 Find
仅在使用模拟测试时失败,它在生产中运行良好。
BusAcnt:(Id 是主键)
在此处查看我的其余设置。
在调试中,我深入了解了 Locals | 这个 | MyDbContext 和所有模拟的帐户都已加载并FirstOrDefault
返回预期的帐户。
在双打的配套文章中:
他们谈论实施Find
,但这在 Mocking 文章中没有提到。
有没有其他人设法使该Find
方法与模拟一起使用?
有没有其他人遇到过同样的问题,这是 EF6.1 模拟的问题还是我的代码错误?请我有兴趣听取其他人关于他们使用该Find
方法进行模拟的经验。
您是否需要像测试双重文章中那样创建测试 DbSet?模拟文章中设置的语法是什么?
c# - 测试 Arg.Any 任务
我正在尝试测试调用方法的顺序。我遇到的问题是我似乎找不到模拟 Task 对象的好方法。
我正在使用NSubstitute
和Entity Framwork 6
。这就是我的代码的样子。
为了进一步强调我需要回答的内容,我应该将其插入 Arg.Any<>。
c# - 实体框架 6.1 更新记录的子集
我有一个仅封装了一些数据库模型属性的视图模型。视图模型包含的这些属性是我要更新的唯一属性。我希望其他属性保持其价值。
在我的研究中,我发现这个 答案似乎非常适合我的需求,但是,尽管我尽了最大努力,但我无法让代码按预期工作。
这是我想出的一个孤立的例子:
我究竟做错了什么?