我正在按照本教程
使用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
我使用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
我的旧代码看起来像这样:
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它不是这个项目的选择
该模型
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) 部署新版本的现有.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似乎有点不安全.如果我在一个盒子上托管两个小网站,它会如何运作?
我正在尝试使用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.
使用ASP.NET Core和EF Core,我正在尝试将迁移应用于数据库.但是,appsettings.json应用程序将使用的连接字符串中的登录仅具有CRUD访问权限,因为安全性问题,因此无法创建表和列等.因此,当我运行时:
dotnet ef database update -c MyDbContextName -e Development
Run Code Online (Sandbox Code Playgroud)
我想告诉它使用不同的连接字符串,但我不知道是否可以这样做?基本上,我想使用两个不同的连接字符串,一个用于部署,另一个用于运行应用程序.这可能吗?有更好的方法吗?谢谢.
在旧的WCF时代,您可以通过MaxConcurrentCalls设置控制服务并发性.MaxConcurrentCalls默认为16个并发呼叫,但您可以根据需要提高或降低该值.
如何在.NET Core Web API中控制服务器端并发?我们可能需要在我们的情况下限制它,因为太多的并发请求会妨碍整体服务器性能.
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事务的隔离级别的信息.
我试图跟踪所有类型的事件,并在跟踪结果中通过"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设置在上面.
由于事务已经启动但尚未提交,因此可以SPID从dm_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
我有一个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之前进行设置.
非常感谢那些读过这个地方的人)
asp.net-core ×5
c# ×5
asp.net-mvc ×2
sql-server ×2
.net-core ×1
asp.net ×1
caching ×1
concurrency ×1
hangfire ×1
linux ×1
ninject ×1
transactions ×1
xunit2 ×1