EntityFramework Core如何映射动态模型?

【导读】本文我们来探讨下映射动态模型的几种方式,相信一部分童鞋项目有这样的需求,比如每天/每小时等生成一张表,此种动态模型映射非常常见,经我摸索,这里给出每一步详细思路,希望能帮助到没有任何头绪的童鞋

本文以.NET Core 3.1控制台,同时以SQL Server数据库作为示例演示(其他数据库同理照搬),由于会用到内置APi,因版本不同可能比如构造函数需略微进行调整即可。

注:虽为示例代码,但我将其作为实际项目皆已进行封装,基本完全通用。本文略长(约5334字),请耐心。

动态映射模型引入前提

首先我们给出所需要用到的特性以及对应枚举,看注释一看便知

public enum CustomTableFormat
{/// <summary>/// 每天,(yyyyMMdd)/// </summary>[Description("每天")]DAY,/// <summary>/// 每小时,(yyyyMMddHH)/// </summary>[Description("每小时")]HOUR,/// <summary>/// 每分钟(yyyyMMddHHmm)/// </summary>[Description("每分钟")]MINUTE
}[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class EfEntityAttribute : Attribute
{/// <summary>/// 是否启用动态生成表/// </summary>public bool EnableCustomTable { get; set; } = false;/// <summary>/// 动态生成表前缀/// </summary>public string Prefix { get; set; }/// <summary>/// 表生成规则/// </summary>public CustomTableFormat Format { get; set; } = CustomTableFormat.DAY;public override string ToString(){if (EnableCustomTable){return string.IsNullOrEmpty(Prefix) ? Format.FormatToDate() : $"{Prefix}{Format.FormatToDate()}";}return base.ToString();}
}public static class CustomTableFormatExetension
{public static string FormatToDate(this CustomTableFormat tableFormat){return tableFormat switch{CustomTableFormat.DAY => DateTime.Now.ToString("yyyyMMdd"),CustomTableFormat.HOUR => DateTime.Now.ToString("yyyyMMddHH"),CustomTableFormat.MINUTE => DateTime.Now.ToString("yyyyMMddHHmm"),_ => DateTime.Now.ToString("yyyyMMdd"),};}
}

通过定义特性,主要出发点基于以下两点:

其一:由外部注入模型而非写死DbSet属性访问

其二:每个模型可定义动态映射表规则

动态映射模型方式(一)

首先我们给出需要用到的上下文,为方便演示我们以每分钟自动映射模型为例

public class EfDbContext : DbContext
{public string Date { get; set; } = CustomTableFormat.MINUTE.FormatToDate();public EfDbContext(DbContextOptions<EfDbContext> options) : base(options){}
}

动态模型即指表名不同,比如我们实现每天/每小时/每分钟动态映射模型和生成一张表,如同流动的水一样并非一层不变,但本质上还是那滴水。在下面接口中我们需要用到每分钟生成一张表格式,所以在上下文中定义每分钟属性

第一种方式则是通过实现IModelCacheKeyFactory接口,此接口将指定上下文下所有模型表名进行了缓存,所以我们可以根据所需动态模型表名进行更改即可,如下:

public class CustomModelCacheKeyFactory : IModelCacheKeyFactory
{public object Create(DbContext context){var efDbContext = context as EfDbContext;if (efDbContext != null){return (context.GetType(), efDbContext.Date);}return context.GetType();}
}

上述其实现貌似感觉有点看不太懂,主要这是直接实现接口一步到位,底层本质则是额外调用实例一个缓存键类,我们将上述改为如下两步则一目了然

public class CustomModelCacheKeyFactory : ModelCacheKeyFactory
{private string _date;public CustomModelCacheKeyFactory(ModelCacheKeyFactoryDependencies dependencies): base(dependencies){}public override object Create(DbContext context){if (context is EfDbContext efDbContext){_date = efDbContext.Date;}return new CustomModelCacheKey(_date, context);}
}public class CustomModelCacheKey : ModelCacheKey
{private readonly Type _contextType;private readonly string _date;public CustomModelCacheKey(string date, DbContext context) : base(context){_date = date;_contextType = context.GetType();}public virtual bool Equals(CustomModelCacheKey other)=> _contextType == other._contextType && _date == other._date;public override bool Equals(object obj)=> (obj is CustomModelCacheKey otherAsKey) && Equals(otherAsKey);public override int GetHashCode() => _date.GetHashCode();
}

然后在OnModelCreating方法里面进行扫描特性标识模型进行注册,如下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{var entityMethod = typeof(ModelBuilder).GetMethod(nameof(modelBuilder.Entity), new Type[] { });var assembly = Assembly.GetExecutingAssembly();//【1】使用Entity方法注册foreach (var type in assembly.ExportedTypes){if (!(type.GetCustomAttribute(typeof(EfEntityAttribute)) is EfEntityAttribute attribute)){continue;}if (type.IsNotPublic || type.IsAbstract || type.IsSealed|| type.IsGenericType|| type.ContainsGenericParameters){continue;}entityMethod.MakeGenericMethod(type).Invoke(modelBuilder, new object[] { });}//【2】使用IEntityTypeConfiguration<T>注册modelBuilder.ApplyConfigurationsFromAssembly(assembly);base.OnModelCreating(modelBuilder);
}

上述第一种方式则通过反射将模型注册,其本质则是调用modeBuilder.Entity方法,若我们在模型上使用注解,则对应也会将其应用

但注解不够灵活,比如要标识联合主键,则只能使用Fluent APi,所以我们通过在外部实现IEntityTypeConfiguration进行注册,然后EF Core提供针对该接口程序集注册,其底层本质也是扫描程序集,两种方式都支持,不用再担心外部模型注册问题

紧接着我们给出测试模型,表名为当前分钟,表名利用注解则不行(值必须为常量),所以我们使用如下第二种映射模型

[EfEntity(EnableCustomTable = true, Format = CustomTableFormat.MINUTE)]
public class Test
{[Table(DateTime.Now.ToString("yyyyMMdd"))]public int Id { get; set; }public string Name { get; set; }
}public class TestEntityTypeConfiguration : IEntityTypeConfiguration<Test>
{public void Configure(EntityTypeBuilder<Test> builder){builder.ToTable(DateTime.Now.ToString("yyyyMMddHHmm"));}
}

上述第二种配置未尝不可,但我们还有更加简洁一步到位的操作,所以这里删除上述第二种方式

因为在OnModelCreating方法里面,我们反射了调用了Entity方法,所以我们直接将反射调用Entity方法强制转换为EntityTypeBuilder,在已有基础上,代码做了重点标识

protected override void OnModelCreating(ModelBuilder modelBuilder)
{var entityMethod = typeof(ModelBuilder).GetMethod(nameof(modelBuilder.Entity), new Type[] { });var assembly = Assembly.GetExecutingAssembly();//【1】使用Entity方法注册foreach (var type in assembly.ExportedTypes){if (!(type.GetCustomAttribute(typeof(EfEntityAttribute)) is EfEntityAttribute attribute)){continue;}if (type.IsNotPublic || type.IsAbstract || type.IsSealed|| type.IsGenericType|| type.ContainsGenericParameters){continue;}// 强制转换为EntityTypeBuildervar entityBuilder = (EntityTypeBuilder)entityMethod.MakeGenericMethod(type).Invoke(modelBuilder, new object[] { });if (attribute.EnableCustomTable){entityBuilder.ToTable(attribute.ToString());}}//【2】使用IEntityTypeConfiguration<T>注册modelBuilder.ApplyConfigurationsFromAssembly(assembly);base.OnModelCreating(modelBuilder);
}

最后则是注入上下文,这里我们将内外部容器进行区分(EF Core为何分内部容器,具体原因请参看文章《EntityFramework Core 3.x上下文构造函数可以注入实例呢?》)

因在实际项目中上下文可能需要在上下文构造函数中注入其他接口,比如我们就有可能在上下文构造函数中注入接口从而根据具体接口实现来更改表架构或不同表名规则等等

static IServiceProvider Initialize()
{var services = new ServiceCollection();services.AddEntityFrameworkSqlServer().AddDbContext<EfDbContext>((serviceProvider, options) =>options.UseSqlServer("server=.;database=efcore;uid=sa;pwd=sa123;").UseInternalServiceProvider(serviceProvider));services.Replace(ServiceDescriptor.Singleton<IModelCacheKeyFactory, CustomModelCacheKeyFactory>());return services.BuildServiceProvider();
}

由于我们已区分EF Core内外部容器,所以在替换自定义缓存键工厂时,不能再像如下直接调用ReplaceService方法替换,势必会抛出异常

 options.UseSqlServer("server=.;database=efcore;uid=sa;pwd=sa123;").ReplaceService<IModelCacheKeyFactory, CustomModelCacheKeyFactory>()

同时谨记在非Web项目中利用EF Core始终要使用作用域(scope)来释放上下文,不像Web可基于HTTP请求作为scope,最后我们测试如下

using (var scope1 = ServiceProvider.CreateScope())
{var context1 = scope1.ServiceProvider.GetService<EfDbContext>();context1.Database.EnsureCreated();var type = context1.Model.FindEntityType(typeof(Test));Console.WriteLine(type?.GetTableName());var tests = context1.Set<Test>().ToList();
}Thread.Sleep(60000);using (var scope2 = ServiceProvider.CreateScope())
{var context2 = scope2.ServiceProvider.GetService<EfDbContext>();context2.Database.EnsureCreated();var type = context2.Model.FindEntityType(typeof(Test));Console.WriteLine(type?.GetTableName());var tests1 = context2.Set<Test>().ToList();
}

为方便看到实际效果,我们构建两个scope,然后睡眠一分钟,在界面上打印输出表名,若两分钟后打印表名不一致,说明达到预期

动态映射模型方式(二)

上述我们使用每分钟规则动态映射表,同时可针对不同模型有各自规则(前缀,每小时或每天)等等,这是第一种方式

如果对第一种方式实现完全看懂了,可能会有所疑惑,因为第一种方式其接口生命周期为单例,若不需要岂不还是会将上下文中所有模型都会进行缓存吗

调用OnModelCreating方法只是进行模型构建,我们现直接调用内置APi来手动使用所有模型,此时将不再缓存,所以不再需要IModelCacheKeyFactory接口

对EF Core稍微了解一点的话,我们知道OnModelCreating方法仅仅只会调用一次,我们通过手动构构建和处置所有模型,说了这么多,那么我们到底该如何做呢?

如果看过我之前原理分析的话,大概能知道EntityFramework Core对于模型的处理(除却模型缓存)分为三步,除却模型缓存:构建模型,使用模型,处置模型。

我们将OnModelCreating方法代码全部直接复制过来,只是多了上面三步而已,在我们实例化ModelBuilder时,我们需要提供对应数据库默认约定,然后使用模型、处置模型,结果变成如下这般

 services.AddEntityFrameworkSqlServer().AddDbContext<EfDbContext>((serviceProvider, options) => {options.UseSqlServer("server=.;database=efcore;uid=sa;pwd=sa123;").UseInternalServiceProvider(serviceProvider);var conventionSet = SqlServerConventionSetBuilder.Build();var modelBuilder = new ModelBuilder(conventionSet);// OnModelCreating方法,代码复制options.UseModel(modelBuilder.Model);modelBuilder.FinalizeModel();               )};

运行第一种方式测试代码,然后么有问题

问题来了,要是有多个数据库,岂不是都要像上述再来一遍?上述实现本质上是每次构造一个上下文则会构建并重新使用新的模型,所以我们将其统一放到上下文构造函数中去,然后写个扩展方法构建模型,如下:

public static class ModelBuilderExetension
{public static ModelBuilder BuildModel(this ModelBuilder modelBuilder){var entityMethod = typeof(ModelBuilder).GetMethod(nameof(modelBuilder.Entity), new Type[] { });var assembly = Assembly.GetExecutingAssembly();//【1】使用Entity方法注册foreach (var type in assembly.ExportedTypes){if (!(type.GetCustomAttribute(typeof(EfEntityAttribute)) is EfEntityAttribute attribute)){continue;}if (type.IsNotPublic || type.IsAbstract || type.IsSealed|| type.IsGenericType|| type.ContainsGenericParameters){continue;}var entityBuilder = (EntityTypeBuilder)entityMethod.MakeGenericMethod(type).Invoke(modelBuilder, new object[] { });if (attribute.EnableCustomTable){entityBuilder.ToTable(attribute.ToString());}}//【2】使用IEntityTypeConfiguration<T>注册modelBuilder.ApplyConfigurationsFromAssembly(assembly);return modelBuilder;}
}

最后在上下文构造函数中,简洁调用,如下:

public class EfDbContext : DbContext
{public string Date { get; set; } = CustomTableFormat.MINUTE.FormatToDate();public EfDbContext(DbContextOptions<EfDbContext> options) : base(options){//提供不同数据库默认约定ConventionSet conventionSet = null;if (Database.ProviderName == "Microsoft.EntityFrameworkCore.SqlServer"){conventionSet = SqlServerConventionSetBuilder.Build();}else if (Database.ProviderName == "Microsoft.EntityFrameworkCore.Sqllite"){conventionSet = SqliteConventionSetBuilder.Build();}else if (Database.ProviderName == "Microsoft.EntityFrameworkCore.MySql"){conventionSet = MySqlConventionSetBuilder.Build();}var modelBuilder = new ModelBuilder(conventionSet);var optionBuilder = new DbContextOptionsBuilder(options);//使用模型optionBuilder.UseModel(modelBuilder.Model);//处置模型modelBuilder.FinalizeModel();}protected override void OnModelCreating(ModelBuilder modelBuilder){//构建模型modelBuilder.BuildModel();base.OnModelCreating(modelBuilder);}
}

动态映射模型表生成

看到这里,细心的你不知道有没有发现,我写的打印结果怎么成功了,居然没抛出任何异常,实际情况是必须会抛出异常,因为我们只做到了模型动态映射,但表自动生成我在此之前将其忽略了,如下:

表如何生成这个也看实际情况分析,比如SQL Server写个作业每天自动生成表等,若需兼容多个数据库,怕是有点麻烦

我没花太多时间去看源码,稍微看了下,碰碰运气或许能直接找到根据模型来创建表的接口实现,结果好像没有,即使有也比较麻烦,那么我们就手动构建SQL语句或者通过lambda构建也可

上下文中实现其特性需动态生成的模型我们可以获取得到,然后搞个定时器每分钟去执行生成对应表,针对不同数据库类型,我们可以通过如下属性获取得到(和包同名)


// 比如SQL Server:Microsoft.EntityFrameworkCore.SqlServer
context.Database.ProviderName

这里我以SQL Server数据库为例,其他数据库比如MySqL、Sqlite唯一区别则是自增长设置和列类型不同而已,创建表,通过五部分组成:表是否存在,表名,主键,所有列,约束。我们定义如下:

internal sealed class CustomTableModel
{public CustomEntityType CustomEntityType { get; set; }public string TableName { get; set; } = string.Empty;public string CheckTable { get; set; } = string.Empty;public string PrimaryKey { get; set; } = string.Empty;public string Columns { get; set; } = string.Empty;public string Constraint { get; set; } = string.Empty;public override string ToString(){var placeHolder = $"{CheckTable} create table {TableName} ({PrimaryKey} {Columns}";placeHolder = string.IsNullOrEmpty(Constraint) ? $"{placeHolder.TrimEnd(',')})" : $"{placeHolder}{Constraint})";return placeHolder.Replace("@placeholder_table_name", CustomEntityType.ToString());}
}

由于每次生成只有表名不同,所以我们将整个表数据结构进行缓存,在其内部将表名进行替换就好。整个实现逻辑如下:

public static void Execute()
{using var scope = Program.ServiceProvider.CreateScope();var context = scope.ServiceProvider.GetService<EfDbContext>();context.Database.EnsureCreated();var cache = scope.ServiceProvider.GetService<IMemoryCache>();var cacheKey = context.GetType().FullName;if (!cache.TryGetValue(cacheKey, out List<CustomTableModel> models)){lock (_syncObject){if (!cache.TryGetValue(cacheKey, out models)){models = CreateModels(context);models = cache.Set(cacheKey, models, new MemoryCacheEntryOptions { Size = 100, Priority = CacheItemPriority.High });}}}Create(context, models);
}private static void Create(EfDbContext context, List<CustomTableModel> models)
{foreach (var m in models){context.Execute(m.ToString());}
}internal static void CreateEntityTypes(CustomEntityType customEntityType)
{EntityTypes.Add(customEntityType);
}

上述标红部分很重要,为什么呢?

让其先执行OnModelCreating方法,也就是说我们必须保证所有模型已经构建完毕,我们才能在上下文中拿到所有模型元数据

接下来则是在OnModeCreating方法中,在启动自动映射模型的基础上,添加如下代码(当然也需检查表名是否存在重复):

  if (attribute.EnableCustomTable){entityBuilder.ToTable(attribute.ToString());var customType = new CustomEntityType(){ClrType = type,Prefix = attribute.Prefix,Format = attribute.Format};var existTable = CreateCustomTable.EntityTypes.FirstOrDefault(c => c.ToString() == customType.ToString());if (existTable != null){throw new ArgumentNullException($"Cannot use table '{customType}' for entity type '{type.Name}' since it is being used for entity type '{existTable.ClrType.Name}' ");}CreateCustomTable.CreateEntityTypes(customType);}

相信构建SQL语句这块都不在话下,就不再给出了,若有需要的童鞋,可私信我,人比较多的话,我会将兼容不同数据库的SQL语句构建都会放到github上去以供参考,控制台入口方法调用如下:

private const int TIME_INTERVAL_IN_MILLISECONDS = 60000;
private static Timer _timer { get; set; }
public static IServiceProvider ServiceProvider { get; set; }
static void Main(string[] args)
{ServiceProvider = Initialize();//初始化时检查一次CreateCustomTable.Execute();//定时检查_timer = new Timer(TimerCallback, null, TIME_INTERVAL_IN_MILLISECONDS, Timeout.Infinite);using (var scope1 = ServiceProvider.CreateScope()){var context1 = scope1.ServiceProvider.GetService<EfDbContext>();context1.Database.EnsureCreated();var type = context1.Model.FindEntityType(typeof(Test1));Console.WriteLine(type?.GetTableName());var tests = context1.Set<Test1>().ToList();}Thread.Sleep(60000);using (var scope2 = ServiceProvider.CreateScope()){var context2 = scope2.ServiceProvider.GetService<EfDbContext>();context2.Database.EnsureCreated();var type = context2.Model.FindEntityType(typeof(Test2));Console.WriteLine(type?.GetTableName());var tests1 = context2.Set<Test2>().ToList();}Console.ReadKey();}

接下来则是通过定义上述定时器,回调调用上述Execute方法,如下:

  static void TimerCallback(object state){var watch = new Stopwatch();watch.Start();CreateCustomTable.Execute();_timer.Change(Math.Max(0, TIME_INTERVAL_IN_MILLISECONDS - watch.ElapsedMilliseconds), Timeout.Infinite);}

最后我们来两个模型测试下实际效果

[EfEntity(EnableCustomTable = true, Prefix = "test1", Format = CustomTableFormat.MINUTE)]
public class Test1
{public int Id { get; set; }public int UserId { get; set; }public string Name { get; set; }
}public class Test1EntityTypeConfiguration : IEntityTypeConfiguration<Test1>
{public void Configure(EntityTypeBuilder<Test1> builder){builder.HasKey(k => new { k.Id, k.UserId });}
}[EfEntity(EnableCustomTable = true, Prefix = "test2", Format = CustomTableFormat.MINUTE)]
public class Test2
{public int Id { get; set; }public int UserId { get; set; }public string Name { get; set; }
}public class Test2EntityTypeConfiguration : IEntityTypeConfiguration<Test2>
{public void Configure(EntityTypeBuilder<Test2> builder){builder.HasKey(k => new { k.Id, k.UserId });}
}

最后的最后,老规矩,实现动态映射模型有如上两种方式,通过手动构建SQL语句并缓存,总结如下!

????  使用IModelCacheKeyFactory

???? 手动构建模型、处置模型

  ???? 兼容不同数据库,手动构建SQL语句并缓存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建深度学习模型:原理与实践

构建深度学习模型&#xff1a;原理与实践 引言 随着人工智能技术的飞速发展&#xff0c;深度学习已经成为当今最为炙手可热的研究领域之一。深度学习通过模拟人脑神经网络的工作原理&#xff0c;使得计算机能够具备更强大的学习和识别能力。本文将深入探讨深度学习的基本原理…

petshop4.0 详解之五(PetShop之业务逻辑层设计)[转]

业务逻辑层&#xff08;Business Logic Layer&#xff09;无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计&#xff0c;也即是说它是与系统所应对的领域&#xff08;Domain&#xff09;逻辑有关&#xff0…

自建比赛服务器,《三国杀》怎么自己创建比赛?自建赛事规则介绍

你知道在三国杀怎么自己创建比赛吗&#xff1f;游戏真的有这个功能吗&#xff1f;下面就让我们一起来看看三国杀自建赛事规则介绍吧。三国杀在2.113版本更新中新增了赛事大厅功能&#xff0c;该玩法支持玩家自建比赛&#xff0c;可以建立"私密赛"和“公开赛”两种比赛…

地线与接地螺丝_电气接地规范与接地的各项参数

点击上方↑「老王和你聊电气」关注我吧电气接地规范1、适用范围&#xff1a;本规范规定了生产经营单位用电系统、新建扩建、检维修、改造、办公区域、员工宿舍等电气线路接地规定。2、术语和定义&#xff1a;电气系统配置保护方法有&#xff1a;保护接地、保护接零、重复接地、…

如何在 Blazor WebAssembly中 使用 功能开关

微软Azure 团队开发的 功能管理 (Feature Management) 包 Microsoft.FeatureManagement可用于实现 功能开关&#xff0c;可以通过功能开关特性动态的改变应用程序的行为而不需要改变任何的业务逻辑代码。关于功能开关的更多功能请看Edi Wang的B站视频&#xff0c;长按小程序码进…

jbl css-h15,JBL CSS8006BM 天花音箱

原标题&#xff1a;JBL CSS8006BM 天花音箱JBL CSS8006BM 天花音箱JBL Commercial CSS-8006BM吸顶扬声器为寻呼和背景音乐应用提供了出色的性能。即使在低敲击设置下&#xff0c;高灵敏度也能提供最大音量。产品特性/ PRODUCT FEATURES价格实惠&#xff0c;高品质的双锥天花扬声…

窗宽窗位改变图像_CT、MRI图像的影像诊断4大原则、5个步骤、3大阅片方法

来源:互联网第一节 影像诊断原则与步骤医学影像诊断包括&#xff38;线、CT、MRI、超声等&#xff0c;是重要的临床诊断方法之一。为了达到正确诊断&#xff0c;必须遵循一定的诊断原则和步骤&#xff0c;才能全面、客观地作出结论。一、影像诊断原则一般应掌握16字原则&#x…

EFCore 5 新特性 Savepoints

EFCore 5 中的 SavepointsIntroEFCore 5中引入了一个新特性&#xff0c;叫做 Savepoints&#xff0c;主要是事务中使用&#xff0c;个人感觉有点类似于 Windows 上的系统还原点&#xff0c;如果事务发生了异常&#xff0c;可以回滚到某一个还原点。Savepoints当我们在一个事务里…

KBuilderTools小灰熊歌词制作

KBuilderTools小灰熊歌词制作<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />——实战KbuilderTools利用KbuilderTools您可以自己制作卡拉OK字幕描述脚本&#xff0c;这样&#xff0c;您可以利用现成的音乐资源&#xff0c;随心…

AWS 宣布创建“真正”开源的 Elasticsearch 分支

喜欢就关注我们吧&#xff01;Elasticsearch 和 Kibana 宣布变更开源许可证后引发了各方激烈讨论&#xff0c;但整起事件的另一个关键角色——被 Elastic 公司 CEO 发文怒斥的 AWS 却一直没有发声。然而就在今日&#xff0c;AWS 宣布将基于目前仍为开源状态的 Elasticsearch 和…

在服务器系统怎么设置地址怎么办,路由器怎么设置地址

路由器怎么设置地址路由器怎么设置地址呢?你是否也很想了解呢?今天我们就一起来看看相关内容吧!路由器怎么设置地址一、自动设置IP地址&#xff0c;使用DHCP服务器功能DHCP是路由器的一个特殊功能&#xff0c;使用DHCP功能可以避免因手工设置IP地址及子网掩码所产生的错误。(…

祝贺 在线文件管理系统 访问量 超过500

到目前为止,<<在线文件管理系统>>一文已有超过500位网友访问过了&#xff0c;深感欣慰。祝贺一下&#xff0c;转载于:https://www.cnblogs.com/GISDEV/archive/2007/10/21/932384.html

dotNet Core 3.1 使用 Elasticsearch

Elasticsearch 是基于 Lucene 的搜索引擎。可以非常方便地实现分布式的全文搜索&#xff0c;本文介绍在 dotNet Core 3.1 中怎样使用 Elasticsearch 。版本dotnet Core &#xff1a;3.1Elasticsearch&#xff1a;7.6.1Kibana&#xff1a;7.6.1NEST&#xff1a;7.10.1Docker&am…

在.NET Core 中实现健康检查

.NET Core中提供了开箱即用的运行状况检查&#xff0c;首先&#xff0c;我将在.NET Core API应用程序中执行运行状况检查&#xff0c;接下来&#xff0c;我们将使用DbContext集成SQL Server或数据库的运行状况检查&#xff0c;最后是如何实现自定义服务的运行状况检查。在ASP.N…

python3.7安装keras教程_Python3.7安装keras和TensorFlow的教程图解

win10 Python3.7安装keras深度学习集成包 TensorFlow 和Ubuntu下安装keras 在win10下安装 安装时必须检查你的python是否为64位&#xff0c;32位不支持&#xff01;&#xff01;&#xff01; 32 位卸载下载其中的64位在python官网 然后在 pip install --upgrade tensorflow 如果…

python离群点检测_如何从熊猫DataFrame中检测峰点(离群值)

我有一个带有多个速度值的熊猫数据帧&#xff0c;这些速度值是连续移动的值&#xff0c;但它是一个传感器数据&#xff0c;因此我们经常在中间出现误差的情况下&#xff0c;移动平均值似乎也无济于事&#xff0c;所以我可以采用什么方法用于从数据中删除这些离群值或峰点&#…

普通故障处理流程

一般OA或者BOSS的用户报故障后流程如下。、从中心机房扫描微波如果基站端能扫描到&#xff0c;但是客户端无法扫描。基本可以排除 基站端设备正常&#xff08;除天线外&#xff09;。问题一般出在客户那里&#xff0c;比如客户端微波数据丢失&#xff0c;停电。天线问题&#x…

读书 | IT人如何直击本质洞察底层逻辑?

【好书共读】| 作者/Edison Zhou作为IT技术人&#xff0c;我们不仅要精进技术&#xff0c;也要在技术之外修炼自己的软能力。本质思考&#xff0c;是一种直击事物本质的能力&#xff0c;是思考“思考的方法”&#xff0c;是一切思考的原动力。我们不用担心这个能力在其他企业用…

内网通mac能用吗_纯干货!小容量Mac装外置硬盘Windows系统最完美的方案!(多图)...

很多用Mac 的同学都会碰到一个很头疼的问题&#xff0c;那就是对 Windows系统的需求&#xff0c;macOS系统虽好&#xff0c;但是很多专业性软件都没有Mac 版本(特别是对国内的用户)&#xff0c;这时大家就会对 Windows系统有需求了。这时候很多同学会想到使用虚拟机或者装 Boot…

卖shell看站什么意思_粤语俚语卖咸鸭蛋是什么意思?

点读&#xff1a;卖咸鸭蛋&#xff08;maai6 haam4 aap3 daan6&#xff09;点解&#xff1a;就是死了的意思点造句&#xff1a;粤&#xff1a;您搵丧彪啊&#xff0c;佢琴日去劈友唔小心赖咗嘢&#xff0c;宜家已经去咗卖咸鸭蛋啦~~普&#xff1a;你找丧彪吗&#xff0c;他昨天…