link #I1LT5R

This commit is contained in:
Monk
2020-07-01 16:08:13 +08:00
parent 985c4b81a0
commit 8fd546f1cd
14 changed files with 659 additions and 40 deletions

View File

@@ -33,5 +33,28 @@ namespace Fur.Application
{
return await _testRepository.Entity.FindAsync(id);
}
public async Task<int> InsertAsync(Test test)
{
var entity = await _testRepository.InsertSaveChangesAsync(test);
return entity.Entity.Id;
}
public async Task<Test> UpdateAsync(int id, string name, int age)
{
var entity = await _testRepository.Entity.FindAsync(id);
entity.Name = name;
entity.Age = age;
var trackEntity = await _testRepository.UpdateSaveChangesAsync(entity);
return trackEntity.Entity;
}
public async Task<Test> DeleteAsync(int id)
{
var entity = await _testRepository.Entity.FindAsync(id);
var trackEntity = await _testRepository.DeleteSaveChangesAsync(entity);
return trackEntity.Entity;
}
}
}

View File

@@ -20,6 +20,12 @@ namespace Fur.EntityFramework.Core.DbContexts
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Test>(entity =>
{
entity.Property(u => u.CreatedTime).HasDefaultValueSql("getdate()");
entity.Property(u => u.UpdatedTime).HasDefaultValueSql("getdate()");
});
}
}
}

View File

@@ -0,0 +1,55 @@
// <auto-generated />
using System;
using Fur.EntityFramework.Core.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Fur.EntityFramework.Core.Migrations
{
[DbContext(typeof(FurSqlServerDbContext))]
[Migration("20200701062556_v0.0.2")]
partial class v002
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "5.0.0-preview.6.20312.4")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Fur.Record.Entities.Test", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<int>("Age")
.HasColumnType("int");
b.Property<DateTime>("CreatedTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.HasColumnType("bit");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("UpdatedTime")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2");
b.HasKey("Id");
b.ToTable("Tests");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,17 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Fur.EntityFramework.Core.Migrations
{
public partial class v002 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
}
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@@ -0,0 +1,55 @@
// <auto-generated />
using System;
using Fur.EntityFramework.Core.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Fur.EntityFramework.Core.Migrations
{
[DbContext(typeof(FurSqlServerDbContext))]
[Migration("20200701062749_v0.0.3")]
partial class v003
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "5.0.0-preview.6.20312.4")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Fur.Record.Entities.Test", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<int>("Age")
.HasColumnType("int");
b.Property<DateTime>("CreatedTime")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2");
b.Property<bool>("IsDeleted")
.HasColumnType("bit");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("UpdatedTime")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2");
b.HasKey("Id");
b.ToTable("Tests");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,17 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Fur.EntityFramework.Core.Migrations
{
public partial class v003 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
}
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@@ -0,0 +1,57 @@
// <auto-generated />
using System;
using Fur.EntityFramework.Core.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Fur.EntityFramework.Core.Migrations
{
[DbContext(typeof(FurSqlServerDbContext))]
[Migration("20200701064031_v0.0.4")]
partial class v004
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "5.0.0-preview.6.20312.4")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Fur.Record.Entities.Test", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<int>("Age")
.HasColumnType("int");
b.Property<DateTime>("CreatedTime")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2")
.HasDefaultValueSql("getdate()");
b.Property<bool>("IsDeleted")
.HasColumnType("bit");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("UpdatedTime")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2")
.HasDefaultValueSql("getdate()");
b.HasKey("Id");
b.ToTable("Tests");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,50 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace Fur.EntityFramework.Core.Migrations
{
public partial class v004 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<DateTime>(
name: "UpdatedTime",
table: "Tests",
type: "datetime2",
nullable: false,
defaultValueSql: "getdate()",
oldClrType: typeof(DateTime),
oldType: "datetime2");
migrationBuilder.AlterColumn<DateTime>(
name: "CreatedTime",
table: "Tests",
type: "datetime2",
nullable: false,
defaultValueSql: "getdate()",
oldClrType: typeof(DateTime),
oldType: "datetime2");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<DateTime>(
name: "UpdatedTime",
table: "Tests",
type: "datetime2",
nullable: false,
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValueSql: "getdate()");
migrationBuilder.AlterColumn<DateTime>(
name: "CreatedTime",
table: "Tests",
type: "datetime2",
nullable: false,
oldClrType: typeof(DateTime),
oldType: "datetime2",
oldDefaultValueSql: "getdate()");
}
}
}

View File

@@ -0,0 +1,57 @@
// <auto-generated />
using System;
using Fur.EntityFramework.Core.DbContexts;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace Fur.EntityFramework.Core.Migrations
{
[DbContext(typeof(FurSqlServerDbContext))]
[Migration("20200701075609_v0.0.5")]
partial class v005
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "5.0.0-preview.6.20312.4")
.HasAnnotation("Relational:MaxIdentifierLength", 128)
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
modelBuilder.Entity("Fur.Record.Entities.Test", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b.Property<int>("Age")
.HasColumnType("int");
b.Property<DateTime>("CreatedTime")
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("getdate()");
b.Property<bool>("IsDeleted")
.HasColumnType("bit");
b.Property<string>("Name")
.HasColumnType("nvarchar(max)");
b.Property<DateTime>("UpdatedTime")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2")
.HasDefaultValueSql("getdate()");
b.HasKey("Id");
b.ToTable("Tests");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,17 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Fur.EntityFramework.Core.Migrations
{
public partial class v005 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
}
protected override void Down(MigrationBuilder migrationBuilder)
{
}
}
}

View File

@@ -30,8 +30,9 @@ namespace Fur.EntityFramework.Core.Migrations
.HasColumnType("int");
b.Property<DateTime>("CreatedTime")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2");
.ValueGeneratedOnAdd()
.HasColumnType("datetime2")
.HasDefaultValueSql("getdate()");
b.Property<bool>("IsDeleted")
.HasColumnType("bit");
@@ -41,7 +42,8 @@ namespace Fur.EntityFramework.Core.Migrations
b.Property<DateTime>("UpdatedTime")
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("datetime2");
.HasColumnType("datetime2")
.HasDefaultValueSql("getdate()");
b.HasKey("Id");

View File

@@ -9,7 +9,7 @@ namespace Fur.DatabaseVisitor.Dependencies
/// <summary>
/// 创建时间
/// </summary>
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public DateTime CreatedTime { get; set; }
/// <summary>
/// 更新时间

View File

@@ -1,37 +1,264 @@
using Fur.DatabaseVisitor.Dependencies;
using Fur.DependencyInjection.Lifetimes;
using Fur.Unmanaged;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Infrastructure;
using System.Collections.Generic;
using System.Data.Common;
using System.Threading.Tasks;
namespace Fur.DatabaseVisitor.Repositories
{
public partial class EFCoreRepositoryOfT<TEntity> : UnmanagedDispose, IRepositoryOfT<TEntity>, IScopedLifetimeOfT<TEntity> where TEntity : class, IEntity, new()
public partial class EFCoreRepositoryOfT<TEntity> : IRepositoryOfT<TEntity>, IScopedLifetimeOfT<TEntity> where TEntity : class, IEntity, new()
{
private readonly DbContext _dbContext;
private readonly DbSet<TEntity> _dbSet;
public EFCoreRepositoryOfT(DbContext dbContext)
{
_dbContext = dbContext;
_dbSet = _dbContext.Set<TEntity>();
DbContext = dbContext;
Entity = DbContext.Set<TEntity>();
}
/// <summary>
/// 数据库操作上下文
/// </summary>
public DbContext DbContext => _dbContext;
/// <summary>
/// 实体对象
/// </summary>
public DbSet<TEntity> Entity => _dbSet;
/// <summary>
/// 数据库操作对象
/// </summary>
public DatabaseFacade Database => _dbContext.Database;
/// <summary>
/// 数据库链接对象
/// </summary>
public DbConnection DbConnection => _dbContext.Database.GetDbConnection();
public virtual DbContext DbContext { get; }
public virtual DbSet<TEntity> Entity { get; }
public virtual DatabaseFacade Database => DbContext.Database;
public virtual DbConnection DbConnection => DbContext.Database.GetDbConnection();
public EntityEntry<TEntity> Delete(TEntity entity)
{
return Entity.Remove(entity);
}
public void Delete(params TEntity[] entities)
{
Entity.RemoveRange(entities);
}
public void Delete(IEnumerable<TEntity> entities)
{
Entity.RemoveRange(entities);
}
public EntityEntry<TEntity> Delete(object id)
{
var entity = Entity.Find(id);
return Delete(entity);
}
public Task<EntityEntry<TEntity>> DeleteAsync(TEntity entity)
{
return Task.FromResult(Entity.Remove(entity));
}
public Task DeleteAsync(params TEntity[] entities)
{
Entity.RemoveRange(entities);
return Task.CompletedTask;
}
public Task DeleteAsync(IEnumerable<TEntity> entities)
{
Entity.RemoveRange(entities);
return Task.CompletedTask;
}
public async Task<EntityEntry<TEntity>> DeleteAsync(object id)
{
var entity = await Entity.FindAsync(id);
return await DeleteAsync(entity);
}
public EntityEntry<TEntity> DeleteSaveChanges(TEntity entity)
{
var trackEntity = Delete(entity);
DbContext.SaveChanges();
return trackEntity;
}
public void DeleteSaveChanges(params TEntity[] entities)
{
Delete(entities);
DbContext.SaveChanges();
}
public void DeleteSaveChanges(IEnumerable<TEntity> entities)
{
Delete(entities);
DbContext.SaveChanges();
}
public EntityEntry<TEntity> DeleteSaveChanges(object id)
{
var trackEntity = Delete(id);
DbContext.SaveChanges();
return trackEntity;
}
public async Task<EntityEntry<TEntity>> DeleteSaveChangesAsync(TEntity entity)
{
var trackEntity = await DeleteAsync(entity);
await DbContext.SaveChangesAsync();
return trackEntity;
}
public async Task DeleteSaveChangesAsync(params TEntity[] entities)
{
await DeleteAsync(entities);
await DbContext.SaveChangesAsync();
}
public async Task DeleteSaveChangesAsync(IEnumerable<TEntity> entities)
{
await DeleteAsync(entities);
await DbContext.SaveChangesAsync();
}
public async Task<EntityEntry<TEntity>> DeleteSaveChangesAsync(object id)
{
var trackEntity = await DeleteAsync(id);
await DbContext.SaveChangesAsync();
return trackEntity;
}
// 新增操作
public virtual EntityEntry<TEntity> Insert(TEntity entity)
{
return Entity.Add(entity);
}
public virtual void Insert(params TEntity[] entities)
{
Entity.AddRange(entities);
}
public virtual void Insert(IEnumerable<TEntity> entities)
{
Entity.AddRange(entities);
}
public virtual ValueTask<EntityEntry<TEntity>> InsertAsync(TEntity entity)
{
return Entity.AddAsync(entity);
}
public virtual Task InsertAsync(params TEntity[] entities)
{
return Entity.AddRangeAsync();
}
public virtual Task InsertAsync(IEnumerable<TEntity> entities)
{
return Entity.AddRangeAsync();
}
public virtual EntityEntry<TEntity> InsertSaveChanges(TEntity entity)
{
var trackEntity = Insert(entity);
DbContext.SaveChanges();
return trackEntity;
}
public virtual void InsertSaveChanges(params TEntity[] entities)
{
Insert(entities);
DbContext.SaveChanges();
}
public virtual void InsertSaveChanges(IEnumerable<TEntity> entities)
{
Insert(entities);
DbContext.SaveChanges();
}
public virtual async ValueTask<EntityEntry<TEntity>> InsertSaveChangesAsync(TEntity entity)
{
var trackEntity = await InsertAsync(entity);
await DbContext.SaveChangesAsync();
return trackEntity;
}
public virtual async Task InsertSaveChangesAsync(params TEntity[] entities)
{
await InsertAsync(entities);
await DbContext.SaveChangesAsync();
await Task.CompletedTask;
}
public virtual async Task InsertSaveChangesAsync(IEnumerable<TEntity> entities)
{
await InsertAsync(entities);
await DbContext.SaveChangesAsync();
await Task.CompletedTask;
}
// 更新操作
public EntityEntry<TEntity> Update(TEntity entity)
{
return Entity.Update(entity);
}
public void Update(params TEntity[] entities)
{
Entity.UpdateRange(entities);
}
public void Update(IEnumerable<TEntity> entities)
{
Entity.UpdateRange(entities);
}
public Task<EntityEntry<TEntity>> UpdateAsync(TEntity entity)
{
var trackEntity = Entity.Update(entity);
return Task.FromResult(trackEntity);
}
public Task UpdateAsync(params TEntity[] entities)
{
Entity.UpdateRange(entities);
return Task.CompletedTask;
}
public Task UpdateAsync(IEnumerable<TEntity> entities)
{
Entity.UpdateRange(entities);
return Task.CompletedTask;
}
public EntityEntry<TEntity> UpdateSaveChanges(TEntity entity)
{
var trackEntity = Update(entity);
DbContext.SaveChanges();
return trackEntity;
}
public void UpdateSaveChanges(params TEntity[] entities)
{
Update(entities);
DbContext.SaveChanges();
}
public void UpdateSaveChanges(IEnumerable<TEntity> entities)
{
Update(entities);
DbContext.SaveChanges();
}
public async Task<EntityEntry<TEntity>> UpdateSaveChangesAsync(TEntity entity)
{
var trackEntities = await UpdateAsync(entity);
await DbContext.SaveChangesAsync();
return trackEntities;
}
public async Task UpdateSaveChangesAsync(params TEntity[] entities)
{
await UpdateAsync(entities);
await DbContext.SaveChangesAsync();
}
public async Task UpdateSaveChangesAsync(IEnumerable<TEntity> entities)
{
await UpdateAsync(entities);
await DbContext.SaveChangesAsync();
}
}
}

View File

@@ -1,8 +1,10 @@
using Fur.DatabaseVisitor.Dependencies;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Infrastructure;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Threading.Tasks;
namespace Fur.DatabaseVisitor.Repositories
{
@@ -10,23 +12,57 @@ namespace Fur.DatabaseVisitor.Repositories
/// 泛型仓储类
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public partial interface IRepositoryOfT<TEntity> : IDisposable where TEntity : class, IEntity, new()
public partial interface IRepositoryOfT<TEntity> where TEntity : class, IEntity, new()
{
/// <summary>
/// 数据库操作上下文
/// </summary>
public DbContext DbContext { get; }
/// <summary>
/// 实体对象
/// </summary>
public DbSet<TEntity> Entity { get; }
/// <summary>
/// 数据库操作对象
/// </summary>
public DatabaseFacade Database { get; }
/// <summary>
/// 数据库链接对象
/// </summary>
public DbConnection DbConnection { get; }
// 新增操作
EntityEntry<TEntity> Insert(TEntity entity);
void Insert(params TEntity[] entities);
void Insert(IEnumerable<TEntity> entities);
ValueTask<EntityEntry<TEntity>> InsertAsync(TEntity entity);
Task InsertAsync(params TEntity[] entities);
Task InsertAsync(IEnumerable<TEntity> entities);
EntityEntry<TEntity> InsertSaveChanges(TEntity entity);
void InsertSaveChanges(params TEntity[] entities);
void InsertSaveChanges(IEnumerable<TEntity> entities);
ValueTask<EntityEntry<TEntity>> InsertSaveChangesAsync(TEntity entity);
Task InsertSaveChangesAsync(params TEntity[] entities);
Task InsertSaveChangesAsync(IEnumerable<TEntity> entities);
// 更新操作
EntityEntry<TEntity> Update(TEntity entity);
void Update(params TEntity[] entities);
void Update(IEnumerable<TEntity> entities);
Task<EntityEntry<TEntity>> UpdateAsync(TEntity entity);
Task UpdateAsync(params TEntity[] entities);
Task UpdateAsync(IEnumerable<TEntity> entities);
EntityEntry<TEntity> UpdateSaveChanges(TEntity entity);
void UpdateSaveChanges(params TEntity[] entities);
void UpdateSaveChanges(IEnumerable<TEntity> entities);
Task<EntityEntry<TEntity>> UpdateSaveChangesAsync(TEntity entity);
Task UpdateSaveChangesAsync(params TEntity[] entities);
Task UpdateSaveChangesAsync(IEnumerable<TEntity> entities);
// 删除操作
EntityEntry<TEntity> Delete(TEntity entity);
void Delete(params TEntity[] entities);
void Delete(IEnumerable<TEntity> entities);
Task<EntityEntry<TEntity>> DeleteAsync(TEntity entity);
Task DeleteAsync(params TEntity[] entities);
Task DeleteAsync(IEnumerable<TEntity> entities);
EntityEntry<TEntity> DeleteSaveChanges(TEntity entity);
void DeleteSaveChanges(params TEntity[] entities);
void DeleteSaveChanges(IEnumerable<TEntity> entities);
Task<EntityEntry<TEntity>> DeleteSaveChangesAsync(TEntity entity);
Task DeleteSaveChangesAsync(params TEntity[] entities);
Task DeleteSaveChangesAsync(IEnumerable<TEntity> entities);
EntityEntry<TEntity> Delete(object id);
Task<EntityEntry<TEntity>> DeleteAsync(object id);
EntityEntry<TEntity> DeleteSaveChanges(object id);
Task<EntityEntry<TEntity>> DeleteSaveChangesAsync(object id);
}
}