问题标签 [ef-core-2.2]

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 投票
2 回答
2877 浏览

c# - 根据请求参数在运行时创建 EF Core DbContext

背景

我们正在使用 ASP.Net Core 和 Entity Framework Core 2.2 构建一个 Web 应用程序

我们正在连接到遗留数据库。设置是有 16 个数据库,都具有完全相同的模式,保存不同的上下文数据。我们无法改变这一点。

我们需要在运行时根据请求参数连接到特定的数据库。

想象一下,母公司下的每个业务都有一个数据库。

假设每个数据库都有 Employee、Client 和 Shift(员工为客户工作的班次)等表。

还有一个“中央”数据库,它保存所有其他数据库共有的信息,如设置等。

我们需要在一个列表视图中列出所有企业的所有员工。

我们计划通过使用中央数据库中的 SQL 视图来检索这些数据,它只是在每个其他数据库中执行一个 UNION(如果您有关于如何更好地做到这一点的建议,请分享)。

我们有一组模型代表所有数据库中的所有实体(表),因为它们共享完全相同的模式,例如一个员工类、一个客户类等。

用例

用户通过以下路径访问网页以查看所有企业的员工列表:

http://example.org/employees

用户然后单击单个员工的“详细信息”链接以查看更多详细信息,将用户带到 url:

http://example.org/employees/details?employeeId=123&businessId=xyz

我坚持的是,在给定 BusinessId 的情况下,我们如何在运行时实例化特定于业务的 DbContext。

我想出了三种方法(现在是第四种,感谢@mylee)来达到预期的结果,并正在寻找来自社区的反馈。

每个选项都假定每个 DbContext 都将实现一个接口,该接口公开所有 DbSets 和 DbContext 方法,然后我们将使用工厂模式来确定要使用哪个 DbContext 实现。

第一个选项: 只需让工厂根据请求参数“bizId”创建正确的 DbContext。

但是,这需要每个 DbContext 覆盖 OnConfiguring 方法并设置 DbProvider - dotnet Core 框架通过其 IoC 容器扩展方法AddDbContext为我们做的事情:

这个问题是我不喜欢我们如何在这里更新上下文。它要求我们在每个上下文中覆盖 OnConfiguring 方法并有权访问连接字符串。

第二个选项:

我更喜欢使用在 Startup.cs 中设置的内置 IoC 容器,但这展示了服务定位器反模式。此外,它会将 Web 项目中的 HttpContext 泄漏到 Infrastructure 项目中(我使用的是 Onion 架构):

第三种选择

将每个 DbContext 注入 Factory 并让 Factory 简单地返回正确的实例:

第四个选项 Encapsulate the configuration within the Factory (这个方法是@mylee建议的)

您是否同意选项 2 展示了服务定位器反模式,即说工厂依赖于其管理创建的对象是否正确?

您认为选项 4 是其中最好的方法吗,因为工厂通常有责任“更新”其对象并且不会导致关注点的混合(即不需要HttpContext )并且它封装了在工厂内构建上下文所需的所有细节(例如 ConnectionString)?

或者有没有办法使用依赖注入来实现这一点而不会导致问题的混合?

或者有没有我在这里没有提到的更好的方法?

0 投票
1 回答
310 浏览

c# - 如何将 DDD 聚合与 TimeSeries 一起使用?

我正在尝试实施一个更面向 DDD 的解决方案来管理时间序列数据。以下代码示例和模式可在此处找到eShopOnWeb。本质上存在三个实体。Site,SignalSample. 一个Site可以有一个集合,Signals一个Signal可以有一个样本集合。

作为第一遍,在没有 Evans 或 Vernon 书籍的情况下苦苦挣扎(它们在帖子中),我已经确定有两个 AggregateRoots 和Site更突出的一个。那是一个Signal真正应该通过Site.

我发现的主要问题是将子集加载SamplesSignal.

根据eShopOnWebSpecification示例中使用的模式,我可以相当轻松地使用聚合并通过调用层中的a 来加载它的聚合集合:SiteSignalsSiteRepositoryInfrastructure

如果我在一个Service课程中,我提供了一个站点和一段时间来计算某些东西,通常涉及多个Signals规范模式会建议如下:

我在这里发现的问题是,在规范中无法过滤Samples包含在Signal

您可以使用这种方法并加载所有数据,Samples但在处理时间序列数据时,这可能意味着数十万个实体,而我们真正需要的是集中选择它们。

我目前在做什么;并且这感觉不是特别“干净”,是实现一个版本的 Generic Repository 类,专门用于在实体上部分加载Sample数据。Signal

这可能只是以新模式开发所带来的最初的不确定性,但这在某种程度上感觉是错误的。

我使用两个聚合是否正确?

0 投票
1 回答
1087 浏览

c# - 从 EF Core 中的子实体获取 Max

假设我的公司有客户有订单。在一个搜索查询中,我想以一种将“具有最新订单的公司放在首位”的方式设置订单。(希望这足够清楚)。

  • 如果客户没有订单,则将最新订单日期视为 DateTime.MinValue

目前我收到此警告: 无法翻译 LINQ 表达式“Max()”并将在本地进行评估

我们可以重写它以在服务器上进行评估吗?

0 投票
3 回答
1412 浏览

entity-framework - EF Core 中的 & 和 && 有什么区别

我知道 && 会使评估短路,因此如果不需要,它就不必评估 RHS,但是 EF 呢?& 和 && 之间有什么区别(| 和 || 相同)?性能方面!

0 投票
1 回答
69 浏览

c# - Entity Framework 核心获取多种类型的最新实体

我正在构建一个端点,以使用 ef 核心从我的数据库中获取最新对象。我的代码是

我想避免对我拥有的每个实体使用几乎相同的代码。想使用类型作为参数,但不知道如何做到这一点。

0 投票
1 回答
5046 浏览

c# - EF Core 2.2 空间类型无法添加到数据库迁移

我正在尝试使用 EF 核心 2.2 构建具有空间对象的数据库,但在尝试创建数据库迁移时遇到了问题。使用https://docs.microsoft.com/en-us/ef/core/modeling/spatial,特别是:

如果我尝试使用它创建迁移,则会收到以下错误:

属性“Country.Border”属于接口类型(“IGeometry”)。如果它是导航属性,则通过将其转换为映射的实体类型手动配置此属性的关系,否则使用“OnModelCreating”中的 NotMappedAttribute 或“EntityTypeBuilder.Ignore”忽略该属性。

同样,如果我将其更改为 Geometry 类型,我会得到:

无法映射属性“Geometry.UserData”,因为它属于“对象”类型,不是受支持的原始类型或有效的实体类型。显式映射此属性,或使用“[NotMapped]”属性或使用“OnModelCreating”中的“EntityTypeBuilder.Ignore”忽略它。

我不提前知道我的对象是点还是线还是多边形,所以它必须是通用的。我如何在我的结构中表示它?另外我看到一些地方说我需要添加以下代码:

但我得到了错误:

“SqlServerDbContextOptionsBuilder”不包含“UseNetTopologySuite”的定义,并且找不到接受“SqlServerDbContextOptionsBuilder”类型的第一个参数的可访问扩展方法“UseNetTopologySuite”(您是否缺少 using 指令或程序集引用?)

即使我安装了 nuget 包

0 投票
1 回答
1424 浏览

asp.net-core - EF Core Join 使用 Include 但 ForeignKey 不是另一张表上的主键

我正在尝试将我的表与另一端的 ForeignKey 和 PrimaryKey 相关联。但现在我将使用一个 ForeignKey,它不是所述表的主键。我正在使用[InverseProperty]但我认为它有一个错误,因为我已经环顾了好几个小时,而且他们都说了同样的话。

文件表:

用户

语境:

我正在尝试使用他们在这里的解决方案,但没有运气。

任何帮助将不胜感激。谢谢!

0 投票
1 回答
6083 浏览

entity-framework-core - 使用 EntityFramework Core 2.2 播种具有数据库生成密钥的数据

我正在使用 EF Core 2.2,使用代码优先方法。

我有我的实体类:

我正在像这样播种我的数据:

但是在尝试添加迁移时收到错误消息:

无法添加实体类型“客户端”的种子实体,因为属性“客户端 ID”需要非零值。考虑提供一个负值以避免与非种子数据发生冲突。

应该是自动生成的ClientID,我不想指定它。是否有解决方法或者这个功能还没有实现?

0 投票
1 回答
87 浏览

entity-framework - 嵌套实体集合

我有一个场景,我试图为特定目的创建一个相同类型的嵌套集合的可增长层次结构,并且我正在使用EF Core 2.2

目标是保存如下数据:

错误

你能告诉我我怎么能做到这一点吗?

0 投票
1 回答
1434 浏览

entity-framework - EF Core 将鉴别器列添加到拥有的实体

所以我的实体有两个拥有实体的属性。出于某种原因,EF Core 正在向其中之一添加一个鉴别器列。如果有人可以帮助我找出我做错了什么或者这里是否有一些奇怪的错误,那就太好了。

这是整个实体,尽管我只是怀疑Requested并且Approved是相关的。

Absence没有任何特殊映射,但 AuditInfo 映射为

这主要生成预期的 SQL,除了这个奇怪的项目:

在此处输入图像描述

这也导致代码在运行时失败并显示以下消息:

我试过的:

我尝试像这样映射项目,这没有什么区别:

我尝试重命名ApprovedApprovedA没有任何区别。

然后我尝试了一个像这样的小型复制器,它不会创建鉴别器列:

现在我没有想法,需要一些帮助。


更新1:

抓住你的帽子,事情即将变得非常奇怪!

当我重命名ApprovedDonkey鉴别器列时消失

在此处输入图像描述

几乎奇怪的是,当我尝试在小测试中使用 Approved 名称对其进行复制时,我仍然没有在那里得到鉴别器列。


更新 2:

所以我尝试了一堆其他的名字。成功意味着没有鉴别器列。

Xpproved = 成功 App = 失败 Ap = 失败 CrAp = 成功 A = 失败 Axx = 成功 ApprovedXX = 失败 XApproved = 成功

这激发了我尝试使用 XApproved 的解决方案,该解决方案有效


更新 3:

AuditInfo 只有这些属性,除了存在之外没有任何映射Owned。它确实有一堆继承它的类: