ASP.NET Core 1.0 开发记录
官方资料:
- https://github.com/dotnet/core
- https://docs.microsoft.com/en-us/aspnet/core
- https://docs.microsoft.com/en-us/ef/core
相关文章:ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录
ASP.NET Core 1.0 更新比较快(可能后面更新就不大了),阅读注意时间节点,这篇博文主要记录用 ASP.NET Core 1.0 开发简单应用项目的一些记录,以备查阅。
ASP.NET Core 1.0 相关 Nuget 程序包源:https://api.nuget.org/v3/index.json
阅读目录:
- 理解 .NET Platform Standard
- Startup 配置
- Sample.BootStrapper.Startup 配置
- ASP.NET Core 1.0 Startup 配置
- UnitTest 单元测试
- 类库项目单元测试
- WebApi 项目单元测试
- Microsoft.EntityFrameworkCore
- 基本配置(MySql)
- ModelBuilderExtenions 扩展
- 记录执行 SQL
- EntityFrameworkCore 迁移
- CLI 命令
1. 理解 .NET Platform Standard
参考文章:
- 理解 .NET Platform Standard
- Running .NET Core apps on multiple frameworks and What the Target Framework Monikers (TFMs) are about
- .NET Platform Standard
在用 ASP.NET Core 1.0 开发之前,理解 .NET Platform Standard(.NET 平台标准)是非常有必要的,因为部署是跨平台的,ASP.NET Core 1.0 应用程序的配置不同,部署环境也会不同,并且项目之间的兼容也会存在一些问题。
.NET Platform Standard 列表(2016 上半年):
Target Platform Name | Alias | |||||||
---|---|---|---|---|---|---|---|---|
.NET Platform Standard | netstandard | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 |
.NET Core | netcoreapp | → | → | → | → | → | → | 1.0 |
.NET Framework | net | → | → | → | → | → | → | 4.6.3 |
→ | → | → | → | → | 4.6.2 | |||
→ | → | → | → | 4.6.1 | ||||
→ | → | → | 4.6 | |||||
→ | → | 4.5.2 | ||||||
→ | → | 4.5.1 | ||||||
→ | 4.5 | |||||||
Universal Windows Platform | uap | → | → | → | → | 10.0 | ||
Windows | win | → | → | 8.1 | ||||
→ | 8.0 | |||||||
Windows Phone | wpa | → | → | 8.1 | ||||
Windows Phone Silverlight | wp | 8.1 | ||||||
8.0 | ||||||||
Mono/Xamarin Platforms | → | → | → | → | → | → | * | |
Mono | → | → | * |
上面图表时间虽然有点老,但和现在的发展是一样的,只不过版本有所更新,主要的三个平台:
- .NET Platform Standard(netstandard):.NET 平台标准,或者称为 .NET 通用平台,是 .NET 部署所有平台的一种通用标准规范(包含 Windows、Mac、Linux 等),建议使用,现在最新版本是 1.6 (2.0 版本快发布)。
- .NET Core(netcoreapp):.NET Core SDK running on CoreCLR/CoreFx,简单来说,可以跑在安装 CoreCLR/CoreFx 的任何平台上(包含 Windows、Mac、Linux 等),前提必须是有 .NET Core 的运行环境,建议使用,现在最新版本是 1.1.0
- .NET Framework(net):.Net Framework SDK running on Desktop CLR / Full BCL and FCL,简单来说,只能跑在 Windows 平台上,不建议使用,最新版本是 4.6.3。
我们在开发 ASP.NET Core 1.0 应用程序的时候,一般是选择netstandard
或netcoreapp
版本,并且这两个平台版本是相互兼容的,分别看一下示例:
netstandard1.6
平台:
{
"version": "1.0.0",
"dependencies": {
"Microsoft.EntityFrameworkCore": "1.0.0",
"NETStandard.Library": "1.6.1"
},
"frameworks": {
"netstandard1.6": {
"imports": "dnxcore50"
}
}
}
"imports": "dnxcore50"
的意思是兼容之前dnxcore50
平台(dnxcore50
现在已被废弃,并被netcoreapp
取代),比如你之前有个类库是用dnxcore50
平台开发的,现在使用netstandard
平台开发的类库,如果不添加此配置,是会报错的。"NETStandard.Library": "1.6.1"
包含了一系列和netstandard
相关的 Nuget 程序包,配置netstandard
平台,必须添加此配置,如果没有的话,.NET 基础的命名空间是访问不到的。
netcoreapp1.1.0
平台:
{
"version": "1.0.0",
"dependencies": {
"Microsoft.EntityFrameworkCore": "1.0.0"
},
"frameworks": {
"netcoreapp1.1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.1.0"
}
}
},
"imports": [
"dotnet5.6",
"portable-net45+win10"
]
}
}
}
netstandard1.1.0
平台和上面netstandard1.6
平台配置差不多,Microsoft.NETCore.App 和 NETStandard.Library 是一样目的,dotnet5.6
和dnxcore50
一样,都是 .NET Core 之前平台的废弃代号。
portable
的意思是便携型,如果添加了此配置,表示应用程序发布部署不携带依赖的程序包,而是使用系统中安装配置的。
还有一点需要注意的是,netcoreapp1.1.0
平台和netstandard1.6
平台开发是相互兼容的,比如我们开发一些自己的 Nuget 程序包,使用的平台版本可以是上面两个,但最好是使用netstandard
低一点的版本,因为以后netstandard
可能是微软平台的一种标准规范,比如我现在开发 Nuget 程序包平台使用netcoreapp1.1.0
,ASP.NET Core 1.0 应用程序使用netcoreapp1.1.0
平台,后者就可以引用前者,因为第三方 Nuget 程序包使用平台版本可能比较低,所以我们开发的 ASP.NET Core 1.0 应用程序平台版本也相应低一些。
2. Startup 配置
Startup 需要添加额外的配置,以便于单元测试的进行,比如 EF、依赖注入和 AutoMapper 配置,需要独立进行配置,而不是放在 ASP.NET Core 1.0 应用程序中的 Startup 配置中。
2.1 Sample.BootStrapper.Startup 配置
比如这样的一个项目 Sample.BootStrapper:
public static class Startup
{
public static void Configure(this IServiceCollection services, string connectionString)
{
services.AddDbContext<SampleDbContext>(options =>
options.UseMySQL(connectionString, b => b.MigrationsAssembly("Sample.WebApi"))
);
services.AddTransient<IUnitOfWork, UnitOfWork>();
services.AddScoped<IDbContext, CommodityDbContext>();
ConfigureMapper();
}
private static void ConfigureMapper()
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<SupplierItem, PurchaseItemDTO>()
.ForMember(d => d.ItemDetailDTOs, opt => opt.MapFrom(s => s.SupplierItemSkus));
cfg.CreateMap<SupplierItemSku, PurchaseItemDetailDTO>();
});
}
}
project.json 配置:
{
"version": "1.0.0-*",
"dependencies": {
"System.ComponentModel.Primitives": "4.1.0",
"Microsoft.NETCore.App": ""
},
"frameworks": {
"netcoreapp1.1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.1.0"
}
}
}
}
}
上面代码主要是对 IServiceCollection 的 Configure 方法进行了扩展,这样对 Domain、Repository 和 AppliactionService 进行独立的单元测试了,只需要在构造函数中进行添加调用即可,后面再说这一点。
2.2 ASP.NET Core 1.0 Startup 配置
另外,ASP.NET Core 1.0 应用程序的 Startup 示例代码:
public class Startup
{
public Startup(IHostingEnvironment env)
{
#if DEBUG
var path = Directory.GetCurrentDirectory();
#else
var path = env.ContentRootPath;
#endif
var builder = new ConfigurationBuilder()
.SetBasePath(path)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Error()
.WriteTo.RollingFile(Path.GetFullPath("logs/log-{Date}.txt"))
.CreateLogger();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
// 配置 WebApi 返回 Json 数据大小写问题,默认数据会首字母小写。
services.AddMvc().AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver());
// 注意这里
services.Configure(Configuration["data:ConnectionString"]);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddSerilog();
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseStaticFiles();
app.UseMvc();
}
}
日志服务使用的是 Serilog,日志级别有多种进行选择(可以 Debug、Error 等),日志和连接字符串的配置可以放在 appsettings.json 文件中,ConfigureServices 里面调用 Sample.BootStrapper.StartUp 的配置。
project.json 示例代码:
{
"dependencies": {
"Microsoft.AspNetCore.Mvc": "1.0.1",
"Microsoft.AspNetCore.Routing": "1.0.1",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.1",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
"Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
"Microsoft.Extensions.Configuration.Json": "1.0.0",
"Microsoft.Extensions.Logging": "1.1.0",
"Microsoft.Extensions.Logging.Console": "1.0.0",
"Microsoft.Extensions.Logging.Debug": "1.0.0",
"Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
"Microsoft.AspNetCore.Cors": "1.0.0",
"Serilog": "2.3.0",
"Serilog.Extensions.Logging":"1.3.1",
"Serilog.Sinks.RollingFile": "3.2.0",
"Microsoft.AspNetCore.StaticFiles": "1.0.0",
"Sample.BootStrapper": "1.0.0-*",
"Microsoft.EntityFrameworkCore.Design": {
"type": "build",
"version": "1.0.0-preview2-final"
}
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final",
"Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
},
"frameworks": {
"netcoreapp1.0.1": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
}
},
"imports": [
"dotnet5.6",
"portable-net45+win10"
]
}
},
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true
},
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true
}
},
"publishOptions": {
"include": [
"wwwroot",
"**/*.cshtml",
"appsettings.json",
"web.config"
]
},
"scripts": {
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
}
appsettings.json 示例代码:
{
"data": {
"ConnectionString": ""
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Error",
"System": "Information",
"Microsoft": "Information"
}
}
}
另外,在 Program.cs 中可以配置选择服务器,比如 IIS 或 Kestrel 等。
3. UnitTest 单元测试
相关文章:
单元测试主要包含两方面:类库项目单元测试和 WebApi 项目单元测试。
3.1 类库项目单元测试
类库项目单元测试代码示例:
using Microsoft.Extensions.DependencyInjection;
using Xunit.Abstractions;
using Sample.BootStrapper;
public class UnitTest
{
private readonly ITestOutputHelper output;
private IServiceProvider provider;
private IProductRepository _productRepository;
public UnitTest(ITestOutputHelper output)
{
var connectionString = "";
var services = new ServiceCollection();
this.output = output;
services.Configure(connectionString);
provider = services.BuildServiceProvider();
_productRepository = provider.GetService<IProductRepository>();
}
[Fact]
public async Task GetTest()
{
Assert.True(true);
}
}
provider.GetService 手动获取依赖注入的对象,ITestOutputHelper 的目的是取代Console.WriteLine
(因为不支持),但现在 ITestOutputHelper 好像也输出不了,之前 RC2 的时候是可以的,不知道啥原因。
3.1 WebApi 项目单元测试
WebApi 项目单元测试示例代码:
using Xunit.Abstractions;
using Microsoft.AspNetCore.TestHost;
using System.Net.Http;
using Microsoft.AspNetCore.Hosting;
using Sample.WebApi;
public class UnitTest
{
private readonly ITestOutputHelper output;
private readonly TestServer _server;
private readonly HttpClient _client;
public UnitTest(ITestOutputHelper output)
{
_server = new TestServer(new WebHostBuilder()
.UseStartup<Startup>());
_client = _server.CreateClient();
}
[Fact]
public async Task GetTest()
{
var ids = new List<int>{1, 2};
var httpContent = new StringContent(JsonConvert.SerializeObject(ids), Encoding.UTF8, "application/json");
var response = await _client.PostAsync($"/products", httpContent);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
}
RC2 版本是无法对 WebApi 进行单元测试的,因为 TestHost 不支持,现在 ASP.NET Core 1.0 版本和 ASP.NET WebApi 2 是差不多的了,使用也很方便,不过 HttpClient 没有了 PostAsJsonAsync 方法,需要使用 JsonConvert 手动转换一下。
project.json 配置代码:
{
"version": "1.0.0-*",
"testRunner": "xunit",
"dependencies": {
"xunit": "2.2.0-beta4-build3444",
"dotnet-test-xunit": "2.2.0-preview2-build1029",
"Microsoft.AspNetCore.TestHost": "1.0.0",
"Microsoft.Extensions.DependencyInjection": "1.1.0",
"Sample.BootStrapper": "1.0.0-*",
"Sample.WebApi": "1.0.0-*"
},
"frameworks": {
"netcoreapp1.0.1": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
}
},
"imports": [
"dotnet5.6",
"portable-net45+win10"
]
}
}
}
我之前用netstandard1.6
平台,但配置 xunit 的时候,发现不支持最新的版本,后来就该用了netcoreapp1.0.1
,testRunner
配置后可以在 Test Explorer 窗口中看到单元测试,也可以在方法的窗口上看到,主要用于调试目的。
单元测试命令:dotnet test
4. Microsoft.EntityFrameworkCore
4.1 基本配置
Microsoft.EntityFrameworkCore 和 EntityFramework 7 的用法差不多,现在项目使用的 MySql 数据库,示例配置代码:
public class SampleDbContext : DbContext
{
public SampleDbContext(DbContextOptions<SampleDbContext> options)
: base(options)
{ }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.AddEntityConfigurationsFromAssembly(GetType().GetTypeInfo().Assembly);
}
}
Map 映射配置(可能多个):
public class ProductMap : EntityMappingConfiguration<Product>
{
public override void Map(EntityTypeBuilder<Product> builder)
{
builder.HasKey(p => p.Id);
}
}
4.2 ModelBuilderExtenions 扩展
AddEntityConfigurationsFromAssembly 是对 ModelBuilder 的扩展,这样如果有多个实体映射配置,OnModelCreating 中只需要一行代码就可以了,扩展代码:
public interface IEntityMappingConfiguration
{
void Map(ModelBuilder b);
}
public interface IEntityMappingConfiguration<T> : IEntityMappingConfiguration where T : class
{
void Map(EntityTypeBuilder<T> builder);
}
public abstract class EntityMappingConfiguration<T> : IEntityMappingConfiguration<T> where T : class
{
public abstract void Map(EntityTypeBuilder<T> b);
public void Map(ModelBuilder b)
{
Map(b.Entity<T>());
}
}
public static class ModelBuilderExtenions
{
private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
{
return assembly
.GetTypes()
.Where(x =>
!x.GetTypeInfo().IsAbstract &&
x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType && y.GetGenericTypeDefinition() == mappingInterface));
}
public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
{
var mappingTypes = assembly.GetMappingTypes(typeof(IEntityMappingConfiguration<>));
foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<IEntityMappingConfiguration>())
config.Map(modelBuilder);
}
}
project.json 示例代码:
{
"version": "1.0.0-*",
"dependencies": {
"MySql.Data.EntityFrameworkCore": "7.0.6-IR31",
"MySql.Data": "7.0.6-IR31",
"System.Reflection.TypeExtensions": "4.3.0",
"Microsoft.Extensions.DependencyInjection": "1.1.0"
},
"frameworks": {
"netcoreapp1.0.1": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
}
}
}
}
}
EntityFrameworkCore 针对 MySql 微软没有开放相应的 Nuget 程序包,第三方有很多的程序包,但或多或少的有些问题,MySql.Data.EntityFrameworkCore 是 EntityFrameworkCore GitHub Issue 中出现最多的,并且是 MySql 自己开发的,所以使用的话没什么问题。
如果在查询的时候报这个错误:
System.MissingMethodException was unhandled
HResult=-2146233069
Message=Method not found: 'Void Microsoft.EntityFrameworkCore.Query.QueryContextFactory..ctor(Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IStateManager, Microsoft.EntityFrameworkCore.Internal.IConcurrencyDetector, Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IChangeDetector)'.
Source=Microsoft.EntityFrameworkCore.Relational
StackTrace:
at Microsoft.EntityFrameworkCore.Query.Internal.RelationalQueryContextFactory..ctor(IStateManager stateManager, IConcurrencyDetector concurrencyDetector, IRelationalConnection connection, IChangeDetector changeDetector)
--- End of stack trace from previous location where exception was thrown ---
解决方式是引用 MySql.Data.EntityFrameworkCore 程序包的类库,移除 Microsoft.EntityFrameworkCore 程序包,参考资料:MissingMethodException DbSet.ToList
4.3 记录执行 SQL
另外,关于 EntityFrameworkCore 如何记录执行 SQL,Google 找了好久也没找到好的解决方案,最后找到了一个别人写的 IQueryable 扩展方法:
public static class IQueryableExtensions
{
private static readonly TypeInfo QueryCompilerTypeInfo = typeof(QueryCompiler).GetTypeInfo();
private static readonly FieldInfo QueryCompilerField = typeof(EntityQueryProvider).GetTypeInfo().DeclaredFields.First(x => x.Name == "_queryCompiler");
private static readonly PropertyInfo NodeTypeProviderField = QueryCompilerTypeInfo.DeclaredProperties.Single(x => x.Name == "NodeTypeProvider");
private static readonly MethodInfo CreateQueryParserMethod = QueryCompilerTypeInfo.DeclaredMethods.First(x => x.Name == "CreateQueryParser");
private static readonly FieldInfo DataBaseField = QueryCompilerTypeInfo.DeclaredFields.Single(x => x.Name == "_database");
private static readonly FieldInfo QueryCompilationContextFactoryField = typeof(Database).GetTypeInfo().DeclaredFields.Single(x => x.Name == "_queryCompilationContextFactory");
public static string ToSql<TEntity>(this IQueryable<TEntity> query) where TEntity : class
{
if (!(query is EntityQueryable<TEntity>) && !(query is InternalDbSet<TEntity>))
{
throw new ArgumentException("Invalid query");
}
var queryCompiler = (IQueryCompiler)QueryCompilerField.GetValue(query.Provider);
var nodeTypeProvider = (INodeTypeProvider)NodeTypeProviderField.GetValue(queryCompiler);
var parser = (IQueryParser)CreateQueryParserMethod.Invoke(queryCompiler, new object[] { nodeTypeProvider });
var queryModel = parser.GetParsedQuery(query.Expression);
var database = DataBaseField.GetValue(queryCompiler);
var queryCompilationContextFactory = (IQueryCompilationContextFactory)QueryCompilationContextFactoryField.GetValue(database);
var queryCompilationContext = queryCompilationContextFactory.Create(false);
var modelVisitor = (RelationalQueryModelVisitor)queryCompilationContext.CreateQueryModelVisitor();
modelVisitor.CreateQueryExecutor<TEntity>(queryModel);
var sql = modelVisitor.Queries.First().ToString();
return sql;
}
}
调用示例:
var query = _productRepository.Get(1);
var sql = query.ToSql();
Console.WriteLine(sql);
不过暂时只能输出单表查询的,多表关联查询的执行 SQL 输出不了。
4.4 EntityFrameworkCore 迁移
相关文章:
相对于 EntityFramework 7,EntityFrameworkCore 迁移改变很多,
首先,ASP.NET Core 1.0 project.json 中添加如下配置:
{
"dependencies": {
"Microsoft.EntityFrameworkCore.Design": {
"type": "build",
"version": "1.0.0-preview2-final"
}
},
"tools": {
"Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final"
},
"frameworks": {
"netcoreapp1.0.1": { }
}
}
Sample.BootStrapper.Startup 中 Configure 修改如下:
public static void Configure(this IServiceCollection services, string connectionString)
{
services.AddDbContext<CommodityDbContext>(options =>
options.UseMySQL(connectionString, b => b.MigrationsAssembly("Sample.WebApi"))//添加 MigrationsAssembly
);
///to do...
然后 CMD 直接切换到 Sample.WebApi 文件目录下,执行如下命令:
dotnet ef migrations add 名称
dotnet ef database update
5. CLI 命令
相关资料:.NET Core 命令行接口工具
dotnet 具有以下命令:
dotnet new
:初始化 C# 或 F # 控制台应用程序项目。dotnet restore
:还原给定应用程序的依赖项。dotnet build
:生成 .NET Core 应用程序。dotnet publish
:发布 .NET 可移植或独立应用程序。dotnet run
:从源运行应用程序。dotnet test
:使用 project.json 中指定的测试运行程序运行测试。dotnet pack
:创建代码的 NuGet 包。
CLI 还支持持续集成,不过没试过,我第一次用 dotnet pack
,结合 Nuget Package Explorer 可以很方便的发布管理程序包。
大概就记录这些。
ASP.NET Core 1.0 开发记录的更多相关文章
- ASP.NET 5 RC1 升级 ASP.NET Core 1.0 RC2 记录
升级文档: Migrating from DNX to .NET Core Migrating from ASP.NET 5 RC1 to ASP.NET Core 1.0 RC2 Migrating ...
- ASP.NET Core 1.0开发Web API程序
.NET Core版本:1.0.0-rc2Visual Studio版本:Microsoft Visual Studio Community 2015 Update 2开发及运行平台:Windows ...
- Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录
1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...
- 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
第1部分:http://www.cnblogs.com/cgzl/p/7637250.html 第2部分:http://www.cnblogs.com/cgzl/p/7640077.html 第3部分 ...
- 【转载】从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置
Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...
- asp.net core 3.0 更新简记
asp.net core 3.0 更新简记 asp.net core 3.0 更新简记 Intro 最近把活动室预约项目从 asp.net core 2.2 更新到了 asp.net core 3.0 ...
- Asp.Net Core 2.0 项目实战(9) 日志记录,基于Nlog或Microsoft.Extensions.Logging的实现及调用实例
本文目录 1. Net下日志记录 2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 ...
- EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真
EF Core使用SQL调用返回其他类型的查询 假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...
- vs2015 已经支持开发asp .net core 1.0 rc2 程序了
vs2015 已经支持开发asp .net core 1.0 rc2 程序了 http://mp.weixin.qq.com/s?__biz=MzI0MzM1ODczOQ==&mid=2247 ...
随机推荐
- alias导致virtualenv异常的分析和解法
title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...
- SQL Server 数据加密功能解析
SQL Server 数据加密功能解析 转载自: 腾云阁 https://www.qcloud.com/community/article/194 数据加密是数据库被破解.物理介质被盗.备份被窃取的最 ...
- 在离线环境中使用.NET Core
在离线环境中使用.NET Core 0x00 写在开始 很早开始就对.NET Core比较关注,一改微软之前给人的印象,变得轻量.开源.跨平台.最近打算试着在工作中使用.但工作是在与互联网完全隔离的网 ...
- 常见CSS与HTML使用误区
误区一.多div症 <div class="nav"> <ul> <li><a href="/home/"> ...
- Android raw to bmp
Android raw 格式转 bmp 图像 raw 保存的为裸数据,转换时都需要把它转成RGBA 的方式来显示.其中: 8位RAW: 四位RGBA 来表示一位灰度; 24位RAW: 三位RGB相同, ...
- OpenCV人脸识别Eigen算法源码分析
1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...
- 在开启DRS的集群中修复VMware虚拟主机启动问题
通过iSCSI方式连接到ESXi主机上的外挂存储意外失联了一段时间,导致部分虚拟主机在集群中呈现出孤立的状态,单独登陆到每台ESXi上可以看到这些虚拟主机都变成了unknow状态.因为有过上一次(VM ...
- TFS 测试用例步骤数据统计
TFS系统集成了一套BI系统,基于SQL Server的Analysis Service进行实现的.通过这几年的深入使用,能够感触到这个数据数据仓库模型是多么的优秀,和微软官方提供的数据仓库示例Adv ...
- LoadRunner函数百科叒叒叒更新了!
首先要沉痛通知每周四固定栏目[学霸君]由于小编外派公干,本周暂停. 那么这周就由云层君来顶替了,当然要要说下自己做的内容啦,DuangDuang! <LoadRunner函数百科>更新通知 ...
- 笔记:Memory Notification: Library Cache Object loaded into SGA
笔记:Memory Notification: Library Cache Object loaded into SGA在警告日志中发现一些这样的警告信息:Mon Nov 21 14:24:22 20 ...