在我的 .NET Core / EF Core 应用程序中,我有一个带有嵌套子对象列表的模型。当我检索一个实例时,我需要按子项的属性之一对嵌套列表进行排序。通过查看 EF Core 上的类似问题和报告的问题,我了解到我无法在检索实例时对嵌套列表进行排序。所以现在我试图在加载到内存中后对其进行排序。但在这里我也没有成功。
我正在使用存储库模式来访问 DbContext。
对此列表进行排序的正确方法是什么,以便它始终从我的存储库中正确返回排序?
我试过的最新:
public async Task<Parent> GetParent(int id)
{
var loadedInMemory = context.Parents
.Include(p => p.Children)
.SingleOrDefaultAsync(p => p.Id == id);
var result = loadedInMemory.Result.Children.OrderBy(c => c.Sequence);
// When I order within the Task<Parent>, result becomes IOrderedEnumerable
// and I can't return it.
return await result;
}
Run Code Online (Sandbox Code Playgroud) 我正在使用 EF Core (3.1.15)。在之前的迁移中(也是在 3.1.15 中创建的),引用了一个后来被删除的列。幂等脚本会检查是否在数据库上执行了迁移(确实如此,并且引用仍然显示在表中__EFMigrationsHistory)。但是,由于列不存在,检查没有预期的结果和脚本。
问:为什么不存在的列会导致 SQL 脚本的执行失败?
脚本是用创建的
dotnet-ef migrations script -i -o migrations.sql
Run Code Online (Sandbox Code Playgroud)
失败的自动化脚本的相关部分,ReferenceToLedgerId在以后的迁移中删除的列在哪里:
dotnet-ef migrations script -i -o migrations.sql
Run Code Online (Sandbox Code Playgroud)
错误:
消息 207,级别 16,状态 1,第 3
行 列名称“ReferenceToLedgerId”无效
运行以下 SQL 查询时,结果按预期返回:
IF NOT EXISTS(SELECT * FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210612052003_CLedger')
BEGIN
UPDATE LedgerTable SET LedgerId = ReferenceToLedgerId
END;
Run Code Online (Sandbox Code Playgroud)
| 迁移ID | 产品版本 |
|---|---|
| 20210612052003_CLedger | 3.1.15 |
该数据库是 Azure SQL 数据库。脚本在本地 SQL 开发数据库上不会失败。从那时起,已经应用了十几次迁移,直到现在脚本才失败。
以下是创建特定脚本的调用:
SELECT *
FROM [__EFMigrationsHistory] WHERE [MigrationId] = N'20210612052003_CLedger'
Run Code Online (Sandbox Code Playgroud)
我尝试将表名和列名放在方括号中,但这没有什么区别(例如......[ReferenceToLedgerId]该脚本在使用 Azure …
sql-server entity-framework entity-framework-core azure-sql-database
AutoMapper 是否没有本地方法来更新需要删除、添加或更新实例的嵌套列表?
你好,我在我的 ASP.Net Core 应用程序中使用 AutoMapper 和 EF Core 将我的 API 资源映射到我的模型。这对我的大多数应用程序都运行良好,但我对更新映射嵌套列表的解决方案不满意,其中列出的实例需要持久化。我不想覆盖现有列表,我想删除不再存在于传入资源中的实例、添加新实例并更新现有实例。
型号:
public class MainObject
{
public int Id { get; set; }
public List<SubItem> SubItems { get; set; }
}
public class SubItem
{
public int Id { get; set; }
public int MainObjectId { get; set; }
public MainObject MainObject { get; set; }
public double Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
资源:
public class MainObjectResource
{
public int Id { get; set; } …Run Code Online (Sandbox Code Playgroud) 我们已通过 Azure AD(实现 OAuth 2.0)对多租户 SaaS 应用程序实施身份验证。API 可通过 Angular SPA 访问,也可由其他客户端(例如具有专用客户端 ID 的注册 REST 客户端)访问。如果相关的话:我们使用授权代码流程。
在同一个应用程序上,我们有一个 OData API,我们希望通过它提供对用户应用程序(例如 Excel)的数据访问。由于我们是一个多租户应用程序,因此需要像访问“普通”Web API 时一样对连接进行身份验证,以便我们的数据层可以过滤该租户拥有的数据。
尽管我们只使用 Microsoft 服务(通过 Azure),但 Microsoft Excel 如何使用正确的身份验证方法连接到 OData 源似乎并不明显。我发现一篇文章解释了如何使用具有自定义连接定义的 Power Query 编辑器。我不会考虑这种方法,因为它对于典型的最终用户来说不是一个强大的解决方案。除了这种自定义配置方法之外,我还阅读了有关接管连接的商业第三方库的信息。然而,对于我的 SaaS 客户,我不能建议将此作为通用解决方案。
我还发现另一篇文章使用 Azure 函数作为代理 API 来获取数据。对于最终用户来说,这似乎是一个强大的解决方案,但我不确定如何安全、正确地为正确的用户验证 API(本文中的示例专用于 1 个租户)。
问:是否有强大的(开箱即用的)配置供最终用户从 Excel 访问经过 OAuth 身份验证的 OData feed/API?如果没有,我应该考虑哪些安全的替代方案?
在我作为引用拥有的类型Company包含的实体中(以便表包含地址的属性作为列)。拥有的引用包括通过持有作为类的属性的外键。因此,我需要将此属性配置为外键。 AddressCompanyAddressCountryCountryCodeAddress
当我使用该属性时,ForeignKey("Country")迁移成功,并且使用正确的列创建表作为 FK: [Companies].[Address_CountryCode]。不过,我想对所有 EF Core DbContext 配置使用 Fluent API。由于迁移发现 . 的所有权存在冲突,因此此操作失败Address。
class Company
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string City { get; set; }
public string Street { get; set; }
public string CountryCode { get; set; }
public Country Country { …Run Code Online (Sandbox Code Playgroud) 我正在使用 .net core 3.1 / C# 8.0。我有两个元组,我希望它们具有相等的值,但是运行时返回不等式。我的期望有什么问题?
Tuple<decimal, double> firstTuple;
Tuple<decimal, double> secondTuple;
Run Code Online (Sandbox Code Playgroud)
测试:
bool tuplesEqualInValue = (firstTuple == secondTuple);
Run Code Online (Sandbox Code Playgroud)
屏幕截图显示每个项目的firstTuple和secondTuple保持相同的值。然而第一个测试返回false。
文档和其他 SO 帖子对我暗示测试应该返回true:https :
//docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-7.3/tuple-equality
我的主要应用程序组件通过子组件@Output上的装饰属性与子组件交互。输出属性使用 和EventEmitter<>()。通常,该属性会发出一个简单的布尔值或数字。我想将此输出直接绑定到主应用程序中的属性。但我没有这样做。
我目前正在做的是:
//In my sub component:
@Output() subProperty = new EventEmitter<boolean>();
//In my main template:
<sub-component (subProperty)="setPropertyValue($event)"></subcomponent>
//In my main component (this I would like to avoid):
setPropertyValue(event) {
this.mainProperty = event;
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是避免在我的主要组件中使用该函数并直接绑定到我的属性,但下面的代码不起作用:
//In my sub component:
@Output() subProperty = new EventEmitter<boolean>();
//In my main template:
<sub-component (subProperty)="mainProperty"></subcomponent>
Run Code Online (Sandbox Code Playgroud)
无论如何我可以避免我的主要组件中的附加功能吗?
c# ×4
angular ×1
asp.net-core ×1
automapper ×1
azure ×1
c#-8.0 ×1
eventemitter ×1
excel ×1
oauth-2.0 ×1
sql-server ×1
typescript ×1