小编Ily*_*kov的帖子

在集成测试ASP.NET Core Web API和EF Core时重新配置依赖关系

我正在按照本教程
使用Entity Framework Core和SQL Server进行集成测试

我的代码看起来像这样

集成测试类

public class ControllerRequestsShould : IDisposable
{
    private readonly TestServer _server;
    private readonly HttpClient _client;
    private readonly YourContext _context;

    public ControllerRequestsShould()
    {
        // Arrange
        var serviceProvider = new ServiceCollection()
            .AddEntityFrameworkSqlServer()
            .BuildServiceProvider();

        var builder = new DbContextOptionsBuilder<YourContext>();

        builder.UseSqlServer($"Server=(localdb)\\mssqllocaldb;Database=your_db_{Guid.NewGuid()};Trusted_Connection=True;MultipleActiveResultSets=true")
            .UseInternalServiceProvider(serviceProvider);

        _context = new YourContext(builder.Options);
        _context.Database.Migrate();

        _server = new TestServer(new WebHostBuilder()
            .UseStartup<Startup>()
            .UseEnvironment(Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")));
        _client = _server.CreateClient();
    }

    [Fact]
    public async Task ReturnListOfObjectDtos()
    {
        // Arrange database data
        _context.ObjectDbSet.Add(new ObjectEntity{ Id = 1, Code = "PTF0001", Name = …
Run Code Online (Sandbox Code Playgroud)

c# integration-testing entity-framework-core xunit2 asp.net-core

17
推荐指数
2
解决办法
6682
查看次数

如何在Entity Framework Core中使用多个DbSet属性名称来构建DbContext?

我使用Scaffold-DbContextcommand in Package Manager Console为现有的SQL Server数据库创建和重新创建上下文和实体:

Scaffold-DbContext -provider EntityFramework.MicrosoftSqlServer -connection "my connection string"
Run Code Online (Sandbox Code Playgroud)

除了一件事之外,它的作用非常完美:它DbSet有单数形式的属性名称:

public partial class MyDbContext : DbContext
{
    public virtual DbSet<Request> Request { get; set; }
    public virtual DbSet<RequestHeader> RequestHeader { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢这些名字是复数形式(Requests等).除了网页搜索,我检查了命令语法:

get-Help Scaffold-DbContext -detailed
Run Code Online (Sandbox Code Playgroud)

并没有发现改变这种行为.这是我的packages.config:

<packages>
  <package id="EntityFramework.Commands" version="7.0.0-rc1-final" targetFramework="net46" />
  <package id="EntityFramework.Core" version="7.0.0-rc1-final" targetFramework="net46" />
  ...
</packages>
Run Code Online (Sandbox Code Playgroud)

如何DbSet在脚手架上复数名称?

更新2017-04: DB现在可以在Entity Framework Core 1.1中实现第一个脚手架复数化.请阅读下面的答案了解详情.

c# sql-server entity-framework entity-framework-core visual-studio-2015

15
推荐指数
3
解决办法
5522
查看次数

如何在ASP.net核心中按请求缓存

我的旧代码看起来像这样:

    public static class DbHelper {
        // One conection per request
        public static Database CurrentDb() {
            if (HttpContext.Current.Items["CurrentDb"] == null) {
                var retval = new DatabaseWithMVCMiniProfiler("MainConnectionString");
                HttpContext.Current.Items["CurrentDb"] = retval;
                return retval;
            }
            return (Database)HttpContext.Current.Items["CurrentDb"];
        }
    }
Run Code Online (Sandbox Code Playgroud)

由于我们没有HttpContext在核心中可以轻松访问,我怎样才能实现同样的目的呢?

我需要CurrentDb()从各处轻松访问

想使用像MemoryCache这样的东西,但是请求生命周期.DI它不是这个项目的选择

c# caching asp.net-core-mvc asp.net-core

14
推荐指数
1
解决办法
3831
查看次数

MVC模型没有更新

该模型

class Address
{
    public string Street { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器动作

[HttpPost]
public ActionResult GetAddress(Address model)
{
    if (!String.IsNullOrEmpty(model.Zip))
    {
        model.City = GetCityByZip(model.Zip);
    }
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

风景

<div class="formrow">
    @Html.LabelFor(model => model.City)
    @Html.TextBoxFor(model => model.City) 
    @Html.ValidationMessageFor(model => model.City)
</div>
<div class="formrow"> 
    @Html.LabelFor(model => model.State)
    @Html.DropDownListFor(model => model.State, (IEnumerable<SelectListItem>)ViewBag.States, new { style = "width:217px;" }) 
    @Html.ValidationMessageFor(model => …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc asp.net-mvc-3

12
推荐指数
1
解决办法
9792
查看次数

停止在kestrel上运行的运行dotnet核心网站

部署新版本的现有.net核心网站时.我如何首先安全地停止旧的运行的茶隼应用程序?

以下是我想写的内容(伪部署脚本):

dotnet stop mysite/mysite.dll <---- this line here
mv mysite/ mysite.bak/
cp newly-published-mysite/ mysite/
dotnet run mysite/mysite.dll
Run Code Online (Sandbox Code Playgroud)

killall dotnet似乎有点不安全.如果我在一个盒子上托管两个小网站,它会如何运作?

linux .net-core kestrel-http-server asp.net-core

12
推荐指数
2
解决办法
1万
查看次数

使用Ninject的ASP.NET WebAPI ActionFilters的依赖注入不起作用

我正在尝试使用Ninject在ASP.NET WebAPI中设置ActionFilters上的DI.我按照这里的说明操作:https://github.com/ninject/Ninject.Web.WebApi/wiki/Dependency-injection-for-filters

我这样创建我的ActionFilter:

public class ApiAuthorizeFilter : AbstractActionFilter
{
    private readonly IValidateApiTokenService _validateApiTokenService;

    public ApiAuthorizeFilter(IValidateApiTokenService validateApiTokenService)
    {
        _validateApiTokenService = validateApiTokenService;
    }

    public override bool AllowMultiple => true;

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
    }

    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样配置:

kernel.BindHttpFilter<ApiAuthorizeFilter>(FilterScope.Controller);
Run Code Online (Sandbox Code Playgroud)

基于上述链接的信息,我的理解是ActionFilter然后应该运行所有WebAPI控制器中的所有Actions.但是,我在过滤器中的两个重写方法中都设置了断点,它永远不会被击中.我在配置中设置了一个断点,可以确认它正在执行.

我错过了什么?我需要这个ActionFilter来运行我项目中每个ApiController中的所有Actions.

c# ninject asp.net-web-api

11
推荐指数
1
解决办法
1132
查看次数

EF核心数据库更新的命令行连接字符串

使用ASP.NET Core和EF Core,我正在尝试将迁移应用于数据库.但是,appsettings.json应用程序将使用的连接字符串中的登录仅具有CRUD访问权限,因为安全性问题,因此无法创建表和列等.因此,当我运行时:

dotnet ef database update -c MyDbContextName -e Development
Run Code Online (Sandbox Code Playgroud)

我想告诉它使用不同的连接字符串,但我不知道是否可以这样做?基本上,我想使用两个不同的连接字符串,一个用于部署,另一个用于运行应用程序.这可能吗?有更好的方法吗?谢谢.

entity-framework-core asp.net-core

10
推荐指数
5
解决办法
7465
查看次数

如何在.NET Core Web API中配置并发?

在旧的WCF时代,您可以通过MaxConcurrentCalls设置控制服务并发性.MaxConcurrentCalls默认为16个并发呼叫,但您可以根据需要提高或降低该值.

如何在.NET Core Web API中控制服务器端并发?我们可能需要在我们的情况下限制它,因为太多的并发请求会妨碍整体服务器性能.

concurrency asp.net-core asp.net-core-webapi

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

实体框架:如何在SQL事件探查器中查找事务隔离级别?

BeginTransaction 方法用于管理实体框架6中的事务.它允许为事务设置隔离级别,如下面的代码中所示(仅示例):

using (var context = new DataContext())
{
    using (var transaction = context.Database.BeginTransaction(IsolationLevel.Serializable))
    {
        context.Entities.Add(new Entity());

        context.SaveChanges();

        transaction.Commit();
    } 
}
Run Code Online (Sandbox Code Playgroud)

问题是:当我使用SQL Server Profiler时,我找不到任何有关真正SQL事务的隔离级别的信息.

尝试#1:

我试图跟踪所有类型的事件,并在跟踪结果中通过"isolation"关键字进行搜索.我找到的只有两件事:

EventClass          TextData
-------------------------------------------------------------
ExistingConnection  set transaction isolation level read committed
AuditLogin          set transaction isolation level read committed
Run Code Online (Sandbox Code Playgroud)

READ COMMITTED总是在这些事件中.所以它不是关于我的代码,因为IsolationLevel.Serializable设置在上面.

尝试#2:

由于事务已经启动但尚未提交,因此可以SPIDdm_exec_sessions视图中手动选择实际隔离级别:

SELECT transaction_isolation_level
FROM sys.dm_exec_sessions
WHERE session_id = @Tran_SPID
Run Code Online (Sandbox Code Playgroud)

这是非常不受欢迎的方式.

是否可以直接在Profiler中记录任何EF生成的事务/会话的隔离级别?也许我只是使用错误的工具?

PS实体框架6.1.3和MS SQL Server 2012在船上.

sql-server entity-framework transactions sql-server-2012 entity-framework-6

9
推荐指数
1
解决办法
1860
查看次数

检查HangFire.JobStorage是否已实例化

我有一个ASP.NET MVC应用程序作为Hangfire客户端 - 它排队不同的工作.我正在使用SqlServerJobStorageHangfire.

目前我正在处理一个与Hangfire数据库没有连接的情况,并且未来连接的某个地方正在实例化.

目标是我的ASP.NET MVC应用程序应该在此之前继续工作.连接恢复后,它应该开始排队作业.

因此,应用程序将抛出异​​常Global.asax:

Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("EshopServiceHangfire");
Run Code Online (Sandbox Code Playgroud)

此外,所有工作队列也会抛出异常:

 BackgroundJob.Enqueue<ISomeClass>(x => x.DoSomethingGreat(JobCancellationToken.Null));
Run Code Online (Sandbox Code Playgroud)

我把行Global.asax放在try/catch块中,所以它不会抛出.当有人排队工作时,我想检查一下JobStorage.Current,如果它没有初始化,我会尝试使用相同的代码再次启动它:

Hangfire.GlobalConfiguration.Configuration.UseSqlServerStorage("EshopServiceHangfire");
Run Code Online (Sandbox Code Playgroud)

有人知道这样做的方法吗?文档没有关于此的信息.

有点像Hangfire.GlobalConfiguration.JobStorage.IsInitialized

从Job enqueue捕获异常也是一种方式,但我不喜欢它,因为它抛出非特定的

InvalidOperationException:尚未初始化JobStorage.Current属性值.您必须在使用Hangfire客户端或服务器API之前进行设置.

非常感谢那些读过这个地方的人)

c# asp.net asp.net-mvc hangfire

9
推荐指数
1
解决办法
9349
查看次数