mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-18 20:08:15 +08:00
## v0.3.27
- 增加 行级锁功能,适用修改实体; - 增加 FreeSql.Repository 默认依赖注入的方式,同时保留原有 Autofac; - 优化 FreeSql.Repository Insert 逻辑,参考了 FreeSql.DbContext; - 优化 FreeSql.IUpdate 参照 IInsert 对大批量更新,拆分执行; - 修复 FreeSql.IInsert ClearData 重复利用的 bug(使用 IgnoreColumns 进行大批量插入时会发生);
This commit is contained in:
@ -26,7 +26,7 @@ namespace dbcontext_01 {
|
||||
|
||||
public virtual ICollection<Tag> Tags { get; set; }
|
||||
|
||||
[Version]
|
||||
[Column(IsVersion = true)]
|
||||
public long versionRow { get; set; }
|
||||
}
|
||||
public class Song_tag {
|
||||
|
@ -102,6 +102,27 @@ namespace orm_vs
|
||||
Console.Write(sb.ToString());
|
||||
sb.Clear();
|
||||
|
||||
Console.WriteLine("更新:");
|
||||
Update(sb, 1000, 1);
|
||||
Console.Write(sb.ToString());
|
||||
sb.Clear();
|
||||
Update(sb, 1000, 10);
|
||||
Console.Write(sb.ToString());
|
||||
sb.Clear();
|
||||
|
||||
Update(sb, 1, 1000);
|
||||
Console.Write(sb.ToString());
|
||||
sb.Clear();
|
||||
Update(sb, 1, 10000);
|
||||
Console.Write(sb.ToString());
|
||||
sb.Clear();
|
||||
Update(sb, 1, 50000);
|
||||
Console.Write(sb.ToString());
|
||||
sb.Clear();
|
||||
Update(sb, 1, 100000);
|
||||
Console.Write(sb.ToString());
|
||||
sb.Clear();
|
||||
|
||||
Console.WriteLine("测试结束,按任意键退出...");
|
||||
Console.ReadKey();
|
||||
}
|
||||
@ -150,12 +171,12 @@ namespace orm_vs
|
||||
|
||||
sw.Restart();
|
||||
for (var a = 0; a < forTime; a++) {
|
||||
//fsql.Insert(songs).ExecuteAffrows();
|
||||
using (var db = new FreeSongContext()) {
|
||||
//db.Configuration.AutoDetectChangesEnabled = false;
|
||||
db.Songs.AddRange(songs.ToArray());
|
||||
db.SaveChanges();
|
||||
}
|
||||
fsql.Insert(songs).ExecuteAffrows();
|
||||
//using (var db = new FreeSongContext()) {
|
||||
// //db.Configuration.AutoDetectChangesEnabled = false;
|
||||
// db.Songs.AddRange(songs.ToArray());
|
||||
// db.SaveChanges();
|
||||
//}
|
||||
}
|
||||
sw.Stop();
|
||||
sb.AppendLine($"FreeSql Insert {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms");
|
||||
@ -183,7 +204,46 @@ namespace orm_vs
|
||||
sw.Stop();
|
||||
sb.AppendLine($"EFCore Insert {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void Update(StringBuilder sb, int forTime, int size) {
|
||||
Stopwatch sw = new Stopwatch();
|
||||
|
||||
var songs = fsql.Select<Song>().Limit(size).ToList();
|
||||
sw.Restart();
|
||||
for (var a = 0; a < forTime; a++) {
|
||||
fsql.Update<Song>().SetSource(songs).ExecuteAffrows();
|
||||
}
|
||||
sw.Stop();
|
||||
sb.AppendLine($"FreeSql Update {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms");
|
||||
|
||||
songs = sugar.Queryable<Song>().Take(size).ToList();
|
||||
sw.Restart();
|
||||
Exception sugarEx = null;
|
||||
try {
|
||||
for (var a = 0; a < forTime; a++)
|
||||
sugar.Updateable(songs).ExecuteCommand();
|
||||
} catch (Exception ex) {
|
||||
sugarEx = ex;
|
||||
}
|
||||
sw.Stop();
|
||||
sb.AppendLine($"SqlSugar Update {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms" + (sugarEx != null ? $"成绩无效,错误:{sugarEx.Message}" : ""));
|
||||
|
||||
using (var db = new SongContext()) {
|
||||
songs = db.Songs.Take(size).AsNoTracking().ToList();
|
||||
}
|
||||
sw.Restart();
|
||||
for (var a = 0; a < forTime; a++) {
|
||||
|
||||
using (var db = new SongContext()) {
|
||||
//db.Configuration.AutoDetectChangesEnabled = false;
|
||||
db.Songs.UpdateRange(songs.ToArray());
|
||||
db.SaveChanges();
|
||||
}
|
||||
}
|
||||
sw.Stop();
|
||||
sb.AppendLine($"EFCore Update {size}条数据,循环{forTime}次,耗时{sw.ElapsedMilliseconds}ms\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
[FreeSql.DataAnnotations.Table(Name = "freesql_song")]
|
||||
[SugarTable("sugar_song")]
|
||||
|
@ -1,27 +0,0 @@
|
||||
{
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:64150/",
|
||||
"sslPort": 0
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"repository_01": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"applicationUrl": "http://localhost:64154/"
|
||||
}
|
||||
}
|
||||
}
|
@ -53,7 +53,7 @@ namespace repository_01 {
|
||||
public IConfiguration Configuration { get; }
|
||||
public static IFreeSql Fsql { get; private set; }
|
||||
|
||||
public IServiceProvider ConfigureServices(IServiceCollection services) {
|
||||
public void ConfigureServices(IServiceCollection services) {
|
||||
|
||||
//services.AddTransient(s => s.)
|
||||
|
||||
@ -67,42 +67,28 @@ namespace repository_01 {
|
||||
});
|
||||
|
||||
services.AddSingleton<IFreeSql>(Fsql);
|
||||
//var baseType = typeof(IRepository);
|
||||
//var freeTypes = baseType.Assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
|
||||
//foreach (var type in freeTypes) {
|
||||
// if ((type.IsInterface || type.IsAbstract) && type.IsGenericType) {
|
||||
// if (type.GenericTypeArguments.Length == 1)
|
||||
// services.AddScoped(type, sp => {
|
||||
// return Activator.CreateInstance(typeof(GuidRepository<>).MakeGenericType(type.GenericTypeArguments[0]), sp.GetService<IFreeSql>());
|
||||
// });
|
||||
// else
|
||||
// services.AddScoped(type, sp => {
|
||||
// return Activator.CreateInstance(typeof(DefaultRepository<,>).MakeGenericType(type.GenericTypeArguments[0], type.GenericTypeArguments[1]), sp.GetService<IFreeSql>());
|
||||
// });
|
||||
// continue;
|
||||
// }
|
||||
// services.AddScoped(type);
|
||||
//}
|
||||
|
||||
//var types = GetType().Assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t) && !t.IsAbstract);
|
||||
//foreach (var type in types) {
|
||||
// services.AddScoped(type);
|
||||
//}
|
||||
|
||||
|
||||
var builder = new ContainerBuilder();
|
||||
|
||||
builder.RegisterFreeRepository(filter => filter
|
||||
.Apply<Song>("test", a => a.Title == DateTime.Now.ToString() + System.Threading.Thread.CurrentThread.ManagedThreadId)
|
||||
services.AddFreeRepository(filter => filter
|
||||
//.Apply<Song>("test", a => a.Title == DateTime.Now.ToString() + System.Threading.Thread.CurrentThread.ManagedThreadId)
|
||||
.Apply<ISoftDelete>("softdelete", a => a.IsDeleted == false)
|
||||
,
|
||||
this.GetType().Assembly
|
||||
);
|
||||
|
||||
builder.Populate(services);
|
||||
var container = builder.Build();
|
||||
|
||||
return new AutofacServiceProvider(container);
|
||||
//var builder = new ContainerBuilder();
|
||||
|
||||
//builder.RegisterFreeRepository(filter => filter
|
||||
// //.Apply<Song>("test", a => a.Title == DateTime.Now.ToString() + System.Threading.Thread.CurrentThread.ManagedThreadId)
|
||||
// .Apply<ISoftDelete>("softdelete", a => a.IsDeleted == false)
|
||||
// ,
|
||||
// this.GetType().Assembly
|
||||
//);
|
||||
|
||||
//builder.Populate(services);
|
||||
//var container = builder.Build();
|
||||
|
||||
//return new AutofacServiceProvider(container);
|
||||
}
|
||||
|
||||
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
|
||||
|
Reference in New Issue
Block a user