问题标签 [entity-framework-plus]
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.
asp.net-mvc - 如何延迟在 EF6 中打开事务?
我们使用 ASP.Net MVC + Autofac + EF6。DbContext 由 UnitOfWork 包装。我们通过 Autofac 为每个 http 请求创建它。我们还在 UnitOfWork 构造函数中为整个 http 请求打开事务。
问题是并非所有的 http 请求都必须包含在事务中。他们中的一些人甚至没有对 DB 的请求。
我们想将事务打开延迟到对 DB 的第一个实际请求。任何想法如何做到这一点?
我们可以覆盖 SaveChages 并在保存之前打开事务,但是选择查询不会以这种方式在事务中执行。
这里还有一个问题:我们使用 EF Plus 的全局过滤器来处理软可移动实体。它工作得很好,但是上下文的过滤器初始化相当慢。我们也想将它推迟到对 DB 的第一个实际请求。
c# - 我可以使用 Entity Framework Plus 批量更新受保护的属性和类吗?
有没有办法在受保护(甚至私有)属性上使用 Entity Framework Plus(和 EF6)进行批量更新?
例如,假设我们有一个Planet
实体:
我想运行这样的东西(如此处所述):
...但我不能,因为Planet
并且Status
无法访问他们的保护级别。
有没有办法在不公开这些字段的情况下执行批量更新?
entity-framework-core - 如何将代码优先与 EntityFramework-Plus 的审计功能结合使用?
我正在尝试设置EntityFramework Plus 的 Audit Auto-Save 功能,但看起来我遇到了一些非常愚蠢的问题。我正在遵循“通过覆盖 SaveChanges 和 SaveChangesAsync 自动保存”路径,但我正在尝试使用代码优先,因为我要使用它的项目已经像这样运行了一段时间了。话虽如此,我的 DbContext 看起来像这样:
}
基本上,教程中添加的内容DbSet<AuditEntry>
以及DbSet<AuditEntryProperty>
来自框架本身的类。检查这些元数据,我们有:
和
除了两个属性外,它看起来已经足够好了:public List<AuditEntryProperty> Properties { get; set; }
和public AuditEntry Parent { get; set; }
. 由于它们未标记为virtual
,因此添加迁移将失败。我尝试了一种解决方法,只是想看看我是否可以让它生成表格并且我确实成功了(之前评论过的那些行):
这似乎禁用了两个表都具有的 PrimaryKey-ForeignKey 关系,这些关系是在框架本身内部设置的,因为没有迹象表明我应该手动进行。我什至试图运行脚本只是为了看看它会发生什么,结果是灾难性的:
这让我在插入时出现以下 SQL 错误:String or binary data would be truncated
. 所以我只是回滚到之前的状态,框架有“50% 的输出”,因为每当用户请求插入、更新或删除操作时,它都会将记录保存到 AuditEntry 表(其中包含表等数据)但AuditEntryProperties(新值,旧值,列)中不会保留任何内容,除了这些属性被忽略之外,我想不出其他任何东西是所有这些的原因。
我想我可能会同时覆盖 AuditEntry 和 AuditEntryProperties,但这听起来像是一个大而愚蠢的解决方法。我不是数据库专家,我在这里缺少什么?
编辑:忘记添加迁移代码:
编辑 2 尝试使用 Fluent API 添加 FK:
由于这些属性不是虚拟的,因此仍然无法执行迁移。
entity-framework-core - 如何使用 EF PLUS 过滤孙子
我想使用 Entityframework Plus访问Parent
它唯一的活跃Children
和活跃的Grand Children
关系
父 -> 子 -> 孙子
上面的查询不起作用。孩子不会被过滤。它返回所有孩子,包括不活动的孩子。但是 GrandChildren 会被过滤(但是我猜 Grand Childeren 会在内存中被过滤,而不是在 sql 中)
c# - Entity Framework Plus - 是否可以在不同查询之间共享实体?
我正在评估 EF6 .NET 框架 4.7.2(不是核心)的 EntityFramework Plus。
在初步调查期间,我发现默认情况下缓存键基于 SQL 查询,而不是结果集中的实体类型。
我的问题是,缓存中的实体是否以某种方式共享?
例如,如果我的第一个 EF 查询是:
我的第二个 EF 查询是在第一个 myContext 是 Dispose()d 10 分钟后执行的,它是:
我们可以看到第二个查询的结果集将包含第一个查询的记录。
Entity Framework Plus 是否会检查实体 EF 即将在内存中具体化是否已经存在于第一个查询的缓存中,或者是否存在于某些共享实体缓存中?
如果没有,使用 EF Plus 缓存永不更改或不经常更改的实体以在查询之间共享的最佳实践是什么?
我目前有一个解决方案,即使用标签为用作查找数据的每种实体类型创建派生自 Type.FullName 的命名缓存,但有更好的方法吗?
提前致谢。
c# - EF6 with Entity Framework Plus:将对象从内存缓存添加到实体集合然后保存
我正在使用 EF Plus 的缓存功能在内存中缓存常用的不可变查找实体。
所有缓存的实体类型都可以是某个父实体集合的一部分(即:如果我在缓存中有一个 Product 类型的实体集合,我应该能够将它们中的任何一个添加到代理的 Order 实体的 Products 集合中, “本订单由这些产品组成”)
但是,当我将其中一个缓存项添加到“实时”实体的包含集合时,我得到以下异常:
我该如何解决?Autofac 已注册以创建上下文的 InstancePerRequest(),因此我想知道缓存的实体是否保留了旧的 DbContext。然而,我原以为 EFPlus 会默认分离它们。
缓存可以添加到实体集合属性的查找实体的最佳做法是什么?
编辑 2:现在我暂时禁用了代理创建,但它仍然无法正常工作。这是我得到的代码,它是从缓存中读取的唯一方法(忽略我在这里返回 IQueryable 的事实,我知道它是反模式,稍后会修复)
当我将缓存条目添加到实时代理对象的集合时,如下所示:
现在什么都没有发生……是的, otherInterventionId 是我要添加的实体的主键。
以下是我尝试过的其他内容:我尝试添加一个仅设置了 Id 字段的新 OtherIntervention 对象,但由于缺少 [Required] Description 字段而出现验证错误。如果我可以将一个新对象添加到 OtherInterventions 集合,并将 ID 字段设置为 EXISTING 查找记录的字段,我会很高兴。我真的不想创建 GetByIdAsync 的重载,它会跳过缓存并直接从上下文加载 - 那么缓存的意义何在?
编辑3:看起来我将不得不将缓存中的对象附加到我目前无法访问的上下文(它在存储库后面抽象)
如何在不将项目的父级和兄弟级加载到内存的情况下将项目添加到存储库
编辑 4:从缓存中附加一个对象给我一个错误,即具有相同 Id 的相同类型的对象已经存在!
我现在要放弃了。它需要很长时间才能修复。
如果有人知道任何解决方法,请分享。谢谢。
c# - 在具有 DateTime 属性的实体上使用 IncludeFilter 时出现 InvalidCastException”
我遇到了一个我不理解的 InvalidCastException,特别是与 Entity Framework Plus 库及其 IncludeFilter 扩展方法有关。
总而言之,我有 3 个实体:项目、测试和测试运行: - 每个项目都有一个测试集合;- 每个测试都有一组测试运行。我有一个 ProjectService 类,它实现了一种从数据库中检索项目的方法,并带有用于选择所需包含的选项。这是此方法的代码(我将其剥离为仍然产生相同异常的最小代码段,以及另一段用于比较的代码):
IsArchived 属性的实现(在 Test 类中)如下:
我实际得到 InvalidCastException 的地方(来自 SingleOrDefault 调用):
完整的异常消息是:
System.InvalidCastException:'无法将'System.String'类型的对象转换为'System.Int32'类型。'
以及发生错误时的堆栈跟踪:
在 System.Data.SqlClient.SqlBuffer.get_Int32() 在 System.Data.SqlClient.SqlDataReader.GetInt32(Int32 i) 在 lambda_method(Closure , DbDataReader) 在 Microsoft.EntityFrameworkCore.Storage.Internal.TypedRelationalValueBufferFactory.Create(DbDataReader dataReader) 在Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable
1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func
3 操作,Func3 verifySucceeded) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable
1.Enumerator.MoveNext() 在 System.Linq.Lookup2.CreateForJoin(IEnumerable
1 源,Func2 keySelector, IEqualityComparer
1 比较器)在 System.Linq.Enumerable.JoinIterator[TOuter,TInner,TKey,TResult] (IEnumerable1 outer, IEnumerable
1 内部,Func2 outerKeySelector, Func
2 innerKeySelector,Func3 resultSelector, IEqualityComparer
1 比较器)+MoveNext() at System.Linq.Enumerable.GroupJoinIterator[TOuter,TInner,TKey,TResult](IEnumerable1 outer, IEnumerable
1 内部,Func2 outerKeySelector, Func
2 innerKeySelector,Func3 resultSelector, IEqualityComparer
1 个比较器)+MoveNext() 在 System.Linq.Enumerable.SelectManyIterator[TSource,TCollection,TResult](IEnumerable1 source, Func
2 collectionSelector, Func3 resultSelector)+MoveNext() at System.Linq.Enumerable.SelectEnumerableIterator
2.MoveNext() 在 Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider._TrackEntities[TOut,TIn] (IEnumerable1 results, QueryContext queryContext, IList
1 entityTrackingInfos,IList1 entityAccessors)+MoveNext() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor
1.EnumeratorExceptionInterceptor.MoveNext() 在 Z.EntityFramework.Plus.QueryFutureEnumerable1.SetResult(IEnumerator
1 枚举器)在 Z.EntityFramework.Plus.QueryFutureEnumerable1.SetResult(DbDataReader reader) at Z.EntityFramework.Plus.QueryFutureBatch.ExecuteQueries() at Z.EntityFramework.Plus.QueryFutureValue
1.get_Value() 在 Z.EntityFramework.Plus.QueryIncludeFilterProvider1.Execute[TResult](Expression expression) at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable
1 源,表达式` 1 个谓词)在 Tresse.Service.Impl.ProjectService.Get(Int32 projectId, ProjectIncludeOptions 包括)
最让我困惑的是,当我使用 ProjectIncludeOptions.DOMAINS 部分时,我没有得到任何异常,这显然是以完全相同的方式实现的(IsArchived 属性在 TestDomain 对象上也是相同的)。
更重要的是,我所有的实体(Project、Test、TestRun 和 TestDomain)都有 DateTime 属性,它们似乎在这个问题中发挥了作用。实际上,如果我将 Test 和 TestRun 中的所有 DateTime 属性标记为[NotMapped]
(同时将所有代码保留在 ProjectService 中,如上所示),那么异常就会消失!如果我只映射了一个 DateTime 属性(无论是哪一个),则会触发异常。但是,它们似乎不会对 TestDomain 和上面的代码造成任何问题。
这对你们中的任何人都有意义吗?
我设法通过完全删除 IncludeFilter 中的 WHERE 子句来解决这种情况(因为它对我的项目并不重要),但我很乐意至少了解正在发生的事情并有一个解决方案。:)
c# - 在 ThenInclude 上过滤,使用 EntityFrameworkPlus IncludeFilter
我正在尝试向下过滤三个子级别,并仅找到 PropertyMailingAddress.Status== True 的子元素。
如何将过滤器向下转换三个级别并使用 EntityFrameworkPlus IncludeFilter 进行嵌套过滤?最有效的方法是什么?
类结构嵌套如下:
- 财产
- 财产党
- 聚会
- 聚会邮寄地址
- PropertyMailingAddress <--- 状态应该等于真(任何状态 == False 的孙子 PropertyMailingAddress 节点,都应该从此嵌套的孙子分支中删除,保留为 True 的 PropertyMailingAddress 节点)
这种原始方式不起作用:
尝试使用 Entity Framework Plus 的有效方法:最后一行是否必须重新链接并再次与上面的嵌套 wheres 连接,或者是否可以?
*我们将需要所有嵌套实体,同时过滤,
目前使用的是 Net Core 2.2
c# - EF Core 全局实体过滤器
我正在寻找一种将全局过滤器应用于我在 EF 中的实体的方法。我偶然发现了EF plus,但在过滤我的相关实体时遇到了一些问题。我当前的设置如下所示:
我有一个TenantEntity
,它固有的Entity
,它包含像CreatedUtc
, UpdatedUtc
,Id
和TenantId
其他一般的东西。
然后,我有一个通用的MultitenantRepository
,这是应用过滤的地方(目前使用 EF plus):
我为数据库中的每个实体创建一个新的 MultitenantRepository,例如对于Team
实体,我将像这样创建它:
这就是问题发生的地方,Team
and TeamMember
( Team.Members
) 实体都来自TenantEntity
. 但是如果我打电话UnitOrWork.TeamRepository.GetAll()
,它会过滤掉已删除Team
的s,而不是TeamMembers
团队内的deleted。
有什么方法可以过滤掉这些,而不必扩展我的所有查询?
mysql - 在 EF Plus Core Audit 中存储 Always Encrypted 列值
我目前正在使用 Always Encrypted 来加密 TableA 上的特定列。我使用 Entity Framework Plus Core 添加了审计日志,但它记录了未加密的表 A 的添加属性。有没有办法可以将加密值存储在审核日志表中?