小编Val*_*tor的帖子

EF Core 尝试删除不存在的索引

运行迁移尝试将列从可为空修改为非空时遇到错误。我的模型类如下所示:

public class SaleLandNonDeeded
{
    public Guid SaleLandNonDeededId { get; set; }
    public Guid SaleId { get; set; }
    public decimal? TotalValue { get; set; }

    public virtual Sale Sale { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

以前,SaleId类型为Guid?。这是以下中的模型配置DbContext

modelBuilder.Entity<SaleLandNonDeeded>(entity =>
{
    entity.Property(e => e.SaleLandNonDeededId).HasDefaultValueSql("(newid())");

    entity.Property(e => e.TotalValue).HasColumnType("money");

    entity.HasOne(d => d.Sale)
        .WithMany(p => p.SaleLandNonDeeded)
        .HasForeignKey(d => d.SaleId)
        .HasConstraintName("FK_SaleLandNonDeeded_SaleId");
});
Run Code Online (Sandbox Code Playgroud)

更改类型后,创建了新的迁移:

// This line was added manually to delete null values before changing
// the column type.
migrationBuilder.Sql("DELETE …
Run Code Online (Sandbox Code Playgroud)

c# sql-server entity-framework-core

10
推荐指数
1
解决办法
6459
查看次数

使用EF Core在通用存储库中使用Reflection包含所有导航属性

我正在为EF Core项目创建一个通用存储库,以避免为所有模型编写CRUD.我遇到的主要障碍是没有加载导航属性,因为Core还不支持延迟加载,而泛型类显然无法为类特定属性定义.Include语句.

我正在尝试为我的Get方法执行类似的操作以动态包含所有属性:

public virtual T Get(Guid itemId, bool eager = false)
        {
            IQueryable<T> querySet = _context.Set<T>();

            if (eager)
            {
                foreach (PropertyInfo p in typeof(T).GetProperties())
                {
                    querySet = querySet.Include(p.Name);
                } 
            }

            return querySet.SingleOrDefault(i => i.EntityId == itemId);
        }
Run Code Online (Sandbox Code Playgroud)

但是,当包含不是导航属性的属性时,它会引发错误.

我发现这个答案与EF 5相同,但它涉及EF核心中不存在的方法:

EF5如何获取域对象的导航属性列表

是否有可能在EF Core中完成同样的事情?

c# system.reflection entity-framework-core

8
推荐指数
1
解决办法
4031
查看次数

使用 GROUP BY 和 COUNT 将查询转换为 Linq

我有一个查询来查看用户插入了多少个实体 ( Version = 1) 以及他们更新了多少个实体( Version > 1)。它通过记录的用户名查询整个表和组。这是原始 SQL 查询:

SELECT 
    [s.InternalUser].[UserName],
    COUNT(CASE WHEN s.Version = 1 THEN 1 END) AS [InsertCount],
    COUNT(CASE WHEN s.Version > 1 THEN 1 END) AS [UpdateCount]
FROM [Sale] AS [s]
INNER JOIN [InternalUser] AS [s.InternalUser] ON [s].[InternalUserId] = 
    [s.InternalUser].[InternalUserId]
GROUP BY [s.InternalUser].[UserName]
Run Code Online (Sandbox Code Playgroud)

这将返回我想要的。我尝试将其转换为使用 EF Core 2.2 的项目中的 Linq 查询:

var countData = await _context.Sale
.GroupBy(s => s.InternalUser.UserName)
.Select(g => new
{
    UserName = g.Key,
    InsertCount = g.Count(s => s.Version == 1), …
Run Code Online (Sandbox Code Playgroud)

c# linq entity-framework-core

8
推荐指数
1
解决办法
3712
查看次数

使用模式使用 dotnet test 测试多个项目

我正在编写一个脚本来在存储库中构建和测试项目。现在,我使用 PowerShell 命令Get-ChildItem -Path test -Filter *.csproj -Recurse | ForEach-Object { dotnet test $_.FullName -c $Configuration }获取我的测试文件夹中的所有 .csproj 文件并在其中运行测试。但是,例如,当我运行时,我注意到dotnet test test/ProjectA/ProjectA.csproj我收到以下消息:

共有 1 个测试文件与指定的模式匹配。

看到这一点,我认为可以使用一种模式通过一个命令在多个项目中运行测试,但我找不到它的文档或让它工作。当我尝试时,dotnet test test/**/*.csproj我得到:

MSBUILD:错误 MSB1009:项目文件不存在。

.net-core dotnet-test

7
推荐指数
2
解决办法
3762
查看次数

使用参数进行团队成员身份的ASP.NET核心身份授权

我有一个像这样的表的应用程序:

  • 用户(ASP.NET核心标识)
  • 球队
  • UserTeam(多对多连接表)

用户可以是多个团队的成员,并且可以在团队中具有不同的角色.例如,用户可能是TeamA的TeamAdmin,但只是TeamB的普通成员.因此,使用静态值定义的简单角色检查和策略将不起作用.

我正在寻找一种方法来根据用户团队及其在团队中的角色为用户授权控制器操作,这些操作将作为声明或单独的RoleTeam表添加.假设Controller操作如下:

[HttpGet]
[Authorize(???)]
public IActionResult ManageTeam(Guid teamId)
{ }
Run Code Online (Sandbox Code Playgroud)

我需要验证用户是否具有相关团队的TeamAdmin角色.是否有一种干净的方法来使用可以访问teamId参数的Authorize属性来装饰它?或者我是否必须在if (User.IsTeamAdmin(teamId)......语句中包含所有这些操作的内容?

c# asp.net-core asp.net-core-identity

6
推荐指数
1
解决办法
2995
查看次数

.NET 标准库输出不包含 nuget 依赖项

我有这三个项目:

  1. ASP.NET Core MVC 应用程序(针对 .NET Framework 4.6.2)
  2. 包含我的 EF Core 模型、迁移和 DbContext 类的类库(针对 .NET Standard 2.0,以前是 .NET Framework 4.6.2)。
  3. 用于使用 EF Core 迁移更新数据库的控制台应用程序(针对 .NET Framework 4.6.2)。

1 和 3 都参考 2。我刚刚用一个针对 .NET Standard 的新类库替换了旧的 .NET Framework 类库。类库使用Microsoft.EntityFrameworkCore.ProxiesNuGet包。

一切构建都没有错误,我的单元测试全部运行,并且 ASP.NET Core 应用程序运行没有问题。我的问题是,用于更新数据库的控制台应用程序构建、运行,但在初始化DbContext构造函数中的这一行时遇到运行时错误:

ChangeTracker.LazyLoadingEnabled = false;

说它无法加载程序集Microsoft.EntityFrameworkCore.Proxies。经过调查,我发现该Microsoft.EntityFrameworkCore.Proxies.dll文件不在控制台应用程序或类库项目的构建输出中。类库项目输出中唯一的 .dll 是项目 .dll 本身,旧的 .NET Framework 版本在输出中也包含所有 NuGet 包 .dll,并且使用数据库更新工具运行良好。

在 .NET 标准库的输出中包含依赖项是否需要额外的东西?

.net c# visual-studio nuget

6
推荐指数
2
解决办法
5046
查看次数

以管理员身份在 WiX 安装中运行 Powershell 脚本

我有一个 WiX 安装程序,需要在安装后运行 Powershell 脚本。我已经到了安装程序实际上运行脚本的地步:

<SetProperty Id="RunStartScript"
        Before ="RunStartScript"
        Sequence="execute"
        Value="&quot;C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe&quot; -NonInteractive -ExecutionPolicy Bypass -InputFormat None -NoProfile -File &quot;[INSTALLDIR]Scripts/Start.ps1&quot;" />

<CustomAction Id="RunStartScript" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="deferred" Return="check" Impersonate="yes" />
<InstallExecuteSequence>
      <Custom Action="RunStartScript" Before="InstallFinalize">NOT Installed OR UPGRADINGPRODUCTCODE</Custom>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)

但是,msi 失败并出现以下错误:

脚本“Start.ps1”无法运行,因为它包含以管理员身份运行的“#requires”语句。当前 Windows PowerShell 会话未以管理员身份运行。使用“以管理员身份运行”选项启动 Windows PowerShell,然后尝试再次运行该脚本。

安装程序在安装开始之前已经提示输入管理员身份,因此我假设 PowerShell 命令已经以管理员身份运行,但事实并非如此。

我找到了一些答案,涉及在脚本开头添加代码以检查管理员权限并将命令和参数传递给管理会话,但我正在寻找另一个选项的可能性,因为这是一个签名脚本其他人提供的,因此对其进行的任何更改都必须返回给他们重新签名。

windows powershell wix

5
推荐指数
1
解决办法
4212
查看次数

将声明转换与 Windows 身份验证结合使用

在 ASP.NET Core 2.1 应用程序中使用 Windows 身份验证。在数据库中,我们有一个User存储用户及其 Sid 的表。它具有 1-1 关系,UserProfile其中包含我想用于索赔的信息。

我为索赔转换添加了此服务:

public class UserStatusClaimsTransformation : IClaimsTransformation
{
    private readonly MyDbContext _context;

    public UserStatusClaimsTransformation(MyDbContext context)
    {
        _context = context;
    }

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        if (principal.Identity is WindowsIdentity identity)
        {
            User user = await _context.User
                .Include(u => u.UserProfile)
                .Where(u => new SecurityIdentifier(u.WindowsSid, 0) == identity.User)
                .SingleOrDefaultAsync();

            if (user != null)
            {
                identity.AddClaim(new Claim("Status", user.UserProfile));
            }
        }

        return principal;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,一旦注册此服务,IPrincipal管道中其他地方的访问现在ClaimsPrincipal …

c# windows-authentication claims-based-identity asp.net-core

5
推荐指数
1
解决办法
1939
查看次数

ASP.NET Core 应用程序在空闲后响应请求缓慢

我有一个在 Windows Server 2016 计算机上运行的 ASP.NET Core MVC 应用程序。我遇到的问题是,闲置约 1 分钟后,应用程序响应请求的速度很慢。如果我连续使用该应用程序,一切都很好,很快,但如果我一分钟不提交请求,下一个请求将需要 10 秒以上才能得到响应。

我开始摆弄 IIS 应用程序池设置以使其保持活力,但没有任何改变。最后,我完全删除了 IIS,并使用 Http.Sys 运行应用程序的构建,行为没有改变。我在 cmd 窗口中监视了应用程序日志,因为它在 Http.Sys 中运行,闲置一分钟后,当下一个请求进来大约 10 秒时没有输出,因此应用程序甚至没有开始执行任何操作直到那时。10 秒后,应用程序将在正常时间内响应请求。

应用程序日志示例:

信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0] 执行端点 'XXXXXX (XXXX)' 信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 路由与 {action = "xxx", controller = "xxx"} 匹配。执行操作 XXXXXX (XXXX) 信息:Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 请求在 6.2621ms 200 text/html 内完成;字符集=utf-8

// 立即刷新页面:

信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0] 执行端点 'XXXXXX (XXXX)' 信息:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 路由与 {action = "xxx", controller = "xxx"} 匹配。执行操作 XXXXXX (XXXX) 信息:Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 请求在 6.658ms 内完成 200 text/html;字符集=utf-8

// 等待 1 分钟,然后刷新页面(日志中大约 10 秒没有任何活动,然后是这样的:)

信息:Microsoft.AspNetCore.Routing.EndpointMiddleware[0] 执行端点 'XXXXXX …

iis windows-server-2016 asp.net-core

5
推荐指数
0
解决办法
976
查看次数

EF Core启用有条件的延迟加载

我正在寻找一种可能的方式来启用我的延迟加载,DbContext但并非一直如此,仅在需要时才在特定情况下启用。由于存在诸如带有大型数据集的N + 1查询和JSON序列化遍历对象属性并序列化整个数据库的问题,我通常不希望延迟加载。但是,在某些情况下我确实想要它。生成报告时,我会加载一个顶级对象和许多子对象,以填充报告字段。由于架构的性质,这将需要30个或更多,Include()并且在ThenInclude()没有延迟加载的情况下进行调用。

有没有一种方法可以在执行查询时有条件地启用延迟加载?我尝试使用2 DbContexts,其中一个扩展了另一个并启用了延迟加载,如下所示:

public class MyLazyContext : MyContext
{
    public MyLazyContext(DbContextOptions<MyLazyContext> options) : base(options) { }

    protected override OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLazyLoadingProxies();
    }
}
Run Code Online (Sandbox Code Playgroud)

并将它们分别作为依赖项注入。构造函数在传递DbContextOptions<MyLazyContext>给基本构造函数有一个问题,DbContextOptions<MyContext>因此我将它们都更改为DbContextOptions<MyContext>。尽管此方法在我的Web应用程序中有效,但由于我的通用类激活器的工作方式而导致单元测试失败DbContext-这使我认为该方法具有代码味道,因此我开始寻找更好的解决方案。

c# lazy-loading entity-framework-core asp.net-core

4
推荐指数
1
解决办法
1928
查看次数