超时已过期。XAF .Net6 Winforms 实体框架核心

Timeout expired. XAF .Net6 Winforms Entity Framework Core

提问人:Kirsten 提问时间:11/17/2023 最后编辑:Kirsten 更新时间:11/19/2023 访问量:67

问:

赏金将在 3 天后到期。这个问题的答案有资格获得 +50 声望赏金。克尔斯滕正在寻找一个有信誉的来源的答案

我正在用我的 XAF 23.1.6 EF Core 7.0.3 项目解决为什么在 SQL Server 中打开这么多会话的问题。

在SSMS中,我运行

SELECT *
FROM sys.dm_exec_sessions
WHERE session_id > 50 AND host_name = 'MYCOMPUTER'
ORDER BY last_request_end_time ASC

查看哪些会话处于开放状态。

我从向导中创建了一个具有标准安全性的新项目,并在 Visual Studio IDE 中运行它,同时监视 SSMS 中的会话。

似乎会话数量只会随着我使用该程序而增加。

例如,如果我打开“用户视图”,然后打开“角色视图”,会话会增加。但是,当我关闭这些视图时,会话并没有减少。

如何让 XAF 关闭不需要的会话?

用户体验是超时错误。

[更新]

DbContext 代码是

using DevExpress.ExpressApp.Design;
using DevExpress.ExpressApp.EFCore.DesignTime;
using DevExpress.Persistent.BaseImpl.EF;
using DevExpress.Persistent.BaseImpl.EF.PermissionPolicy;
using Microsoft.EntityFrameworkCore;

namespace MyApp.Module.BusinessObjects;

public class MyAppContextInitializer : DbContextTypesInfoInitializerBase
{
    protected override DbContext CreateDbContext()
    {
        var optionsBuilder = new DbContextOptionsBuilder<MyAppEFCoreDbContext>()
            .UseSqlServer(";")
            .UseChangeTrackingProxies()
            .UseObjectSpaceLinkProxies();
        return new MyAppEFCoreDbContext(optionsBuilder.Options);
    }
}

[TypesInfoInitializer(typeof(MyAppContextInitializer))]
public class MyAppEFCoreDbContext : DbContext
{
    public MyAppEFCoreDbContext(DbContextOptions<MyAppEFCoreDbContext> options) : base(options)
    {
    }
    
    public DbSet<ModelDifference> ModelDifferences { get; set; }
    public DbSet<ModelDifferenceAspect> ModelDifferenceAspects { get; set; }
    public DbSet<PermissionPolicyRole> Roles { get; set; }
    public DbSet<MyApp.Module.BusinessObjects.ApplicationUser> Users { get; set; }
    public DbSet<MyApp.Module.BusinessObjects.ApplicationUserLoginInfo> UserLoginInfos { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.HasChangeTrackingStrategy(ChangeTrackingStrategy.ChangingAndChangedNotificationsWithOriginalValues);
        modelBuilder.UsePropertyAccessMode(PropertyAccessMode.PreferFieldDuringConstruction);
        modelBuilder.Entity<MyApp.Module.BusinessObjects.ApplicationUserLoginInfo>(
            b =>
            {
                b.HasIndex(
                    nameof(DevExpress.ExpressApp.Security.ISecurityUserLoginInfo.LoginProviderName),
                    nameof(DevExpress.ExpressApp.Security.ISecurityUserLoginInfo.ProviderUserKey))
                    .IsUnique();
            });
        modelBuilder.Entity<ModelDifference>()
            .HasMany(t => t.Aspects)
            .WithOne(t => t.Owner)
            .OnDelete(DeleteBehavior.Cascade);
    }
}

[更新]

GitHub 上的演示项目 这里

C# sql-server 实体框架核心 net-6.0 xaf

评论

1赞 Steve Py 11/17/2023
可能首先要查看的是 DbContext 生存期范围的管理方式。是否设置为注入到使用它的代码中,如果是这样,则生命周期范围是多少?还是使用工厂,还是根据需要进行更新?DbContexts 应该是短期的和可释放的,因此不要超过 Web 请求。我不熟悉 XAF 和“会话”,但如果它希望包装像 SignalR 这样的东西来促进向客户端推送通知,那么你将需要更多地参与管理 DbContext 的生存期。
0赞 Kirsten 11/17/2023
XAF 使用 EFObjectSpace 类来管理 DbContext。我本来以为关闭视图会关闭 EFObjectSpace,从而减少 SQL Server 会话。但事实似乎并非如此。
1赞 jmvcollaborator 11/19/2023
您能否提供模型和/或控制器和/或查看实现细节?您应该只处理对象空间。
1赞 jmvcollaborator 11/19/2023
理想情况下,更多的见解会有所帮助,请检查以下内容:XAF 要求在连接到 Microsoft SQL Server 数据库的基于 EF Core 的应用程序中具有多个活动结果集。建议不要删除 MultipleActiveResultSets=True;或将 MultipleActiveResultSets 参数设置为 false
0赞 Kirsten 11/19/2023
我将 MultipleActiveSets 设置为 true。我已经链接了从 Dev Express 向导创建的项目的演示存储库。

答: 暂无答案