提交 c9db284f 编写于 作者: S simon

数据添加,查询正确使用租户code

上级 d1b09643
......@@ -32,7 +32,12 @@ namespace Aurora.Common.Tenant
else //internal
{
tenantContext.TenantCode = _httpContextAccessor.HttpContext.Request.Headers[ConstString.CurrentTenantCode].FirstOrDefault();
if (string.IsNullOrEmpty(tenantContext.TenantCode))
{
tenantContext.TenantCode = "internal";
}
}
return tenantContext;
}
......
......@@ -29,10 +29,10 @@ namespace Aurora.Core.Api.Controllers
/// get cateories list
/// </summary>
/// <returns></returns>
public async Task<ResponseModel<List<CategoryDto>>> GetList()
public async Task<IActionResult> GetList()
{
var res = await _categoryService.GetList();
return res;
return Ok(res);
}
[HttpGet]
......
......@@ -6,11 +6,6 @@ using Aurora.Core.EntityFramework;
using Microsoft.EntityFrameworkCore;
using Aurora.Core.Service;
using Aurora.Core.IService;
using Aurora.Infrastructure.Tenant;
using Aurora.Infrastructure.User;
using Aurora.Common.User;
using Aurora.Common.Tenant;
using Microsoft.AspNetCore.Http;
namespace Aurora.Core.Api
{
......@@ -25,33 +20,15 @@ namespace Aurora.Core.Api
services.AddAutoMapper(Assembly.Load("Aurora.Core.Service"));
services.AddDbContext<ApplicationDbContext>(option =>
option.UseMySQL(configuration["ConnectionStrings:MySql"]));
services.AddDbContext<ApplicationReadonlyDbContext>(option =>
option.UseMySQL(configuration["ReadOnlyConnectionStrings:MySql"]));
option.UseMySQL(configuration["ReadonlyConnectionStrings:MySql"]));
services.AddTransient<ICategoryService, CategoryService>();
// var RFCOptions = services.BuildServiceProvider().GetService<IOptions<SAPRFCSettings>>();
// //注入RFC链接
// services.AddSingleton(p =>
// new RfcConnection(builder => builder
// .UseConnectionHost(RFCOptions.Value.HostName)
// .UseLogonUserName(RFCOptions.Value.UserName)
// .UseLogonPassword(RFCOptions.Value.Password)
// .UseLogonClient(RFCOptions.Value.Client)
// .UseLogonLanguage(RFCOptions.Value.LogonLanguage)
// .UseSystemNumber(RFCOptions.Value.SystemNumber)
// .UseSapRouter(RFCOptions.Value.SapRouter))
// );
// services.AddSingleton<MMGoodsBomClient, MMGoodsBomClient>();
// services.AddSingleton<MMGoodsClient, MMGoodsClient>();
// services.AddSingleton<MMImporrPostDataClient, MMImporrPostDataClient>();
// services.AddSingleton<MMPOClient, MMPOClient>();
// services.AddSingleton<SDExporrPostDataClient, SDExporrPostDataClient>();
// services.AddSingleton<SDSOClient, SDSOClient>();
return services;
}
......
......@@ -13,5 +13,12 @@
"SqlServer": "Data Source=192.168.1.139;Initial Catalog=PTS2;User ID=sa;Password=;Encrypt=False;TrustServerCertificate=False;Pooling=true;max Pool Size=50;min Pool Size=1;MultipleActiveResultSets=True",
"PostgreSql": "Server=localhost;Database=Simon_blog;User ID=xxxxxx;Password=666",
"Sqlite": "Data Source=D:/xxx.db;"
},
"ReadonlyConnectionStrings": {
"Enable": "MySql",
"MySql": "Server=xxxxxx; Port=3306;User Id=root;Password=xxxxx;Database=xxx;Allow User Variables=True",
"SqlServer": "Data Source=192.168.1.139;Initial Catalog=PTS2;User ID=sa;Password=;Encrypt=False;TrustServerCertificate=False;Pooling=true;max Pool Size=50;min Pool Size=1;MultipleActiveResultSets=True",
"PostgreSql": "Server=localhost;Database=Simon_blog;User ID=xxxxxx;Password=666",
"Sqlite": "Data Source=D:/xxx.db;"
}
}
\ No newline at end of file
......@@ -16,56 +16,59 @@ using Microsoft.EntityFrameworkCore;
namespace Aurora.Core.EntityFramework
{
public class ApplicationDbContext : DbContext
public class ApplicationDbContext : ApplicationReadonlyDbContext
{
private readonly ITenantContext currentTenant;
protected readonly IUserContext _userContext;
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options
,ITenantContextProvider currentTenantProvider) : base(options)
, ITenantContextProvider currentTenantProvider
, IUserContextProvider userContextProvider) : base(options, currentTenantProvider)
{
currentTenant = currentTenantProvider.GetTenantContext();
_userContext = userContextProvider.GetUserContext();
}
public DbSet<Category> Categories { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
//配置正在运行的程序集里所有实体映射配置类
builder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly());
//多租户过滤
foreach (var type in GetBaseEntityTypes())
{
var method = SetGlobalQueryMethod.MakeGenericMethod(type);
method.Invoke(this, new object[] { builder });
}
// 配置表名映射
builder.Entity<Category>().ToTable("category");
base.OnModelCreating(builder);
}
private static IList<Type> _baseEntityTypesCache;
public override int SaveChanges()
{
UpdateCommonFileds();
return base.SaveChanges();
}
private static IList<Type> GetBaseEntityTypes()
public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken))
{
if (_baseEntityTypesCache != null)
return _baseEntityTypesCache.ToList();
// 包含了实体类的程序集
var assembly = typeof(TenantEntityBase).GetTypeInfo().Assembly;
// var assembly=Assembly.Load("Aurora.Core.Domain");
_baseEntityTypesCache = (from t in assembly.DefinedTypes
where t.BaseType == typeof(TenantEntityBase)
select t.AsType()).ToList();
return _baseEntityTypesCache;
UpdateCommonFileds();
return base.SaveChangesAsync(cancellationToken);
}
protected static readonly MethodInfo SetGlobalQueryMethod = typeof(ApplicationDbContext).GetMethods(BindingFlags.Public | BindingFlags.Instance)
.Single(t => t.IsGenericMethod && t.Name == "SetGlobalQuery");
public void SetGlobalQuery<T>(ModelBuilder builder) where T : TenantEntityBase
/// <summary>
/// 数据新增、更新前更新公共字段
/// </summary>
private void UpdateCommonFileds()
{
builder.Entity<T>().HasQueryFilter(e => e.TenantCode == currentTenant.TenantCode);
var nowTime = DateTimeOffset.Now;
foreach (var entry in this.ChangeTracker.Entries<TenantEntityBase>().Where(x => x.State == EntityState.Added || x.State == EntityState.Modified))
{
var entity = entry.Entity;
switch (entry.State)
{
case EntityState.Added:
entity.TenantCode = _tenantContext.TenantCode;
entity.CreateTime = nowTime;
entity.CreateUserName = _userContext.UserName;
break;
case EntityState.Modified:
entity.ModifyTime = nowTime;
entity.ModifyUserName = _userContext.UserName;
break;
}
}
this.ChangeTracker.DetectChanges();
}
}
}
\ No newline at end of file
......@@ -14,12 +14,23 @@ namespace Aurora.Core.EntityFramework
{
public class ApplicationReadonlyDbContext : DbContext
{
private readonly ITenantContext currentTenant;
protected readonly ITenantContext _tenantContext;
public ApplicationReadonlyDbContext(DbContextOptions<ApplicationReadonlyDbContext> options
, ITenantContextProvider currentTenantProvider) : base(options)
, ITenantContextProvider currentTenantProvider) : base(options)
{
currentTenant = currentTenantProvider.GetTenantContext();
_tenantContext = currentTenantProvider.GetTenantContext();
}
/// <summary>
/// 用于让子类继承时调用的构造函数
/// </summary>
/// <param name="options"></param>
/// <param name="currentTenantProvider"></param>
/// <returns></returns>
protected ApplicationReadonlyDbContext(DbContextOptions options
, ITenantContextProvider currentTenantProvider) : base(options)
{
_tenantContext = currentTenantProvider.GetTenantContext();
}
public DbSet<Category> Categories { get; set; }
......@@ -42,6 +53,7 @@ namespace Aurora.Core.EntityFramework
base.OnModelCreating(builder);
}
#region 多租户过滤
private static IList<Type> _baseEntityTypesCache;
private static IList<Type> GetBaseEntityTypes()
......@@ -60,7 +72,8 @@ namespace Aurora.Core.EntityFramework
public void SetGlobalQuery<T>(ModelBuilder builder) where T : TenantEntityBase
{
builder.Entity<T>().HasQueryFilter(e => e.TenantCode == currentTenant.TenantCode);
builder.Entity<T>().HasQueryFilter(e => e.TenantCode == _tenantContext.TenantCode);
}
#endregion
}
}
\ No newline at end of file
......@@ -8,6 +8,8 @@ namespace Aurora.Core.IService.Dto
public string Remark { get; set; }
public string TenantCode { get; set; }
public int Id { get; set; }
public int ParentId { get; set; }
public DateTimeOffset CreateTime { get; set; }
public string CreateUserName { get; set; }
public DateTimeOffset ModifyTime { get; set; }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册