惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
T
Threatpost
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
PCI Perspectives
PCI Perspectives
T
The Exploit Database - CXSecurity.com
Y
Y Combinator Blog
雷峰网
雷峰网
爱范儿
爱范儿
The Hacker News
The Hacker News
Last Week in AI
Last Week in AI
Simon Willison's Weblog
Simon Willison's Weblog
T
Tor Project blog
S
Securelist
宝玉的分享
宝玉的分享
L
LangChain Blog
O
OpenAI News
AI
AI
P
Privacy International News Feed
L
LINUX DO - 最新话题
D
DataBreaches.Net
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs
罗磊的独立博客
M
MIT News - Artificial intelligence
Security Archives - TechRepublic
Security Archives - TechRepublic
月光博客
月光博客
博客园 - 【当耐特】
T
Tailwind CSS Blog
C
Cybersecurity and Infrastructure Security Agency CISA
H
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
Jina AI
Jina AI
The Last Watchdog
The Last Watchdog
K
Kaspersky official blog
Webroot Blog
Webroot Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
MyScale Blog
MyScale Blog
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
Recorded Future
Recorded Future
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog

博客园 - 轮回

《Vibe Coding 入门宝典:非程序员的AI开发指南》一本改变软件生产方式的开源书 OpenAI API 百度文心大模型API测试 AI工具导航 一键生成dotnet5项目解决方案 倡议发起博客园#爷青回#挑战活动 1024快乐,加班使我快乐,福报如圣光醍醐灌顶! 记一次断电引起的mongodb彻底奔溃【转载】 dotnet core 3.0 swagger 显示枚举描述 dotnet core swagger filter 隐藏接口和显示枚举描述 dotnet core 项目脚手架这种小事嘛... 不同语言的水仙花性能比较【Test1W】 application.properties详解 --springBoot配置文件【转载】 以太坊客户端Geth命令用法-参数详解【转载】 CentOS7搭建以太坊私有链 【Java编码规范】《阿里巴巴Java开发手册(正式版)》【转载】 SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)【转载】 Eclipse快捷键大全(转载) 在redis一致性hash(shard)中使用lua脚本的坑 如何评价微软Connect 2015?[转载]
.net core 2.2 EF oracle db first
轮回 · 2019-08-20 · via 博客园 - 轮回

Nuget控制台:

Install-Package log4net
Install-Package Newtonsoft.Json
Install-Package Autofac
Install-Package Autofac.Extensions.DependencyInjection
Install-Package AutoMapper
Install-Package Dapper
Install-Package Microsoft.Extensions.Options
Install-Package Microsoft.Extensions.Caching.Abstractions
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

Install-Package Oracle.EntityFrameworkCore
Install-Package Oracle.ManagedDataAccess.Core

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.Relational
Install-Package Microsoft.EntityFrameworkCore.Design
Install-Package Microsoft.EntityFrameworkCore.Tools


Scaffold-DbContext -Force "Data Source=" Oracle.EntityFrameworkCore-OutputDir Models/DataModels -Context MyDbContext -Schemas aaa -Tables bbb 

Scaffold命令格式:

Scaffold-DbContext [-Connection] <String> [-Provider] <String>
[-OutputDir <String>] [-Context <String>] [-Schemas <String>]
[-Tables <String>] [-DataAnnotations] [ -Force] [-Project <String>]
[-StartupProject <String>] [-Environment <String>] [<CommonParameters>]

Startup.cs

 public class Startup
    {
        //log4net日志
        public static ILoggerRepository LogRepository { get; set; }
        public IConfiguration Configuration { get; }

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;

            Init();
        }
        public void Init()
        {
            // 加载log4net日志配置文件
            LogRepository = LogManager.CreateRepository("NETCoreRepository");
            XmlConfigurator.Configure(LogRepository, new FileInfo("log4net.config"));
            LogHelper.RepositoryName = LogRepository.Name;

            // appSettings 配置类初始化
            //ConfigHelper.Init(Configuration.GetSection("appSettings"));

            // 唯一Id生成器
            //SnowflakeInit.Init(Configuration);      
            
            // 邮件初始化
            //MailInit.Init(Configuration);

            // 系统启动日志
            LogHelper.Write("TestApi Start()");
        }

        /// <summary>
        /// 此方法由运行时调用。使用此方法向容器添加服务。
        /// This method gets called by the runtime. Use this method to add services to the container.
        /// </summary>
        public IServiceProvider ConfigureServices(IServiceCollection services)
        {           
            //注册Cookie认证服务
            //services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();

            // 添加MemoryCache
            services.AddMemoryCache();
            // 支持HttpContext
            services.AddHttpContextAccessor();
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            // 实现小写的路由URL
            services.AddRouting(options => options.LowercaseUrls = true);
            // 添加自动映射
            //services.AddAutoMapper();

            // 对 JSON 数据使用混合大小写。驼峰式,但是javascript 首字母小写形式. 默认值
            // services.AddMvc().AddJsonOptions(options => { options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); });
            services.AddMvc().AddJsonOptions(options =>
            {
                // 忽略循环引用
                options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                // 对 JSON 数据使用混合大小写。跟属性名同样的大小.输出
                options.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
                // 格式化json日期           
                options.SerializerSettings.Converters.Add(new Newtonsoft.Json.Converters.IsoDateTimeConverter { DateTimeFormat = "yyyy'-'MM'-'dd' 'HH':'mm':'ss'.'fff" });
                // long型转string           
                options.SerializerSettings.Converters.Add(new Utils.LongToStringConverter());
            });

            //配置跨域处理,允许所有来源:
            services.AddCors(options =>
            {
                options.AddPolicy("cors", set =>
                {
                    set.SetIsOriginAllowed(origin => true). //允许任何来源的主机访问
                    AllowAnyHeader().
                    AllowAnyMethod().
                    AllowCredentials(); //指定处理cookie
                });
            });

            // 添加EF Oracle支持
            services.AddDbContext<MyDbContext>(options => options.UseOracle(Configuration.GetConnectionString("OracleConnectionString")));
            // 如果使用SQL Server 2008数据库,请添加UseRowNumberForPaging的选项
            // 参考资料:https://github.com/aspnet/EntityFrameworkCore/issues/4616
            // options.UseSqlServer(Configuration.GetConnectionString("MyDbContent"),b=>b.UseRowNumberForPaging())

            // 添加Dapper
            //services.AddDapper("OracleConnection", options =>
            //{
            //    options.ConnectionString = Configuration.GetConnectionString("OracleConnectionString");
            //    options.DbType = DbStoreType.Oracle;
            //});
          
            // Add service filters.
            //services.AddScoped<MyAuthAttribute>();
            //services.AddSingleton<MyAuthRepository>();

            //注入全局异常捕获
            services.AddMvc(options =>
            {
                options.Filters.Add(typeof(GlobalExceptions)); // By type
            });           
           
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

            // 注册Autofac
            return RegisterAutofac(services);
        }
        private IServiceProvider RegisterAutofac(IServiceCollection services)
        {
            //实例化Autofac容器
            var builder = new ContainerBuilder();
            //将Services中的服务填充到Autofac中
            builder.Populate(services);
            //新模块组件注册    
            builder.RegisterModule<AutofacModule>();
            //创建容器
            var Container = builder.Build();
            //第三方IOC接管 core内置DI容器 
            return new AutofacServiceProvider(Container);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime appLifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseCookiePolicy();
            app.UseCors("cors");
            app.UseMvc();

            //程序停止调用函数
            //appLifetime.ApplicationStopped.Register(() => { AutofacContainer.Dispose(); });
        }
    }

  Program:

 public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            var configuration = new ConfigurationBuilder().SetBasePath(Environment.CurrentDirectory)
                                        .AddJsonFile("host.json")
                                        .Build();

            return WebHost.CreateDefaultBuilder(args)
                .UseUrls(configuration["urls"])
                .UseStartup<Startup>();
        }
    }

  host.json

{
  "urls": "http://*:8080;https://*:443"
}

  AutofacModule

 public class AutofacModule : Autofac.Module
    {
        /// <summary>
        /// 重写Autofac管道Load方法,在这里注册注入
        /// </summary>
        /// <param name="builder"></param>
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<MyDbContext>();

            //注册Service中的对象,Service中的类要以Service结尾,否则注册失败
            builder.RegisterAssemblyTypes(GetAssemblyByName("WebTest.BLL")).Where(a => a.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerLifetimeScope();
  
            //注册Repository中的对象,Repository中的类要以Repository结尾,否则注册失败
            builder.RegisterAssemblyTypes(GetAssemblyByName("WebTest.DAL")).Where(a => a.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerLifetimeScope();
        }
        /// <summary>
        /// 根据程序集名称获取程序集
        /// </summary>
        /// <param name="AssemblyName">程序集名称</param>
        /// <returns></returns>
        public static System.Reflection.Assembly GetAssemblyByName(string AssemblyName)
        {
            return System.Reflection.Assembly.Load(AssemblyName);
        }
    }

 Utils.LongToStringConverter.cs

public class LongToStringConverter : JsonConverter
    {
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Newtonsoft.Json.Linq.JToken jt = Newtonsoft.Json.Linq.JValue.ReadFrom(reader);
            return jt.Value<long>();
        }

        public override bool CanConvert(Type objectType)
        {
            return typeof(System.Int64).Equals(objectType);
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            serializer.Serialize(writer, value.ToString());
        }
    }