From 7819603e7a4b5b6a57494cf99c338d293869a948 Mon Sep 17 00:00:00 2001 From: dingsongjie Date: Thu, 20 Feb 2020 10:09:50 +0800 Subject: [PATCH] 完成 EFCore grains 全部功能 --- samples/apis/Backet.Api/Controllers/BacketController.cs | 7 +++++++ samples/apis/Backet.Api/Domain/AggregatesModel/BacketAggregate/Backet.cs | 12 +++++++++++- samples/apis/Backet.Api/Grains/Abstraction/IBacketGrain.cs | 1 + samples/apis/Backet.Api/Grains/BacketGrain.cs | 8 ++++++++ samples/apis/Backet.Api/Startup.cs | 12 +++++++----- src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorage.cs | 15 ++++++++++----- src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorageOptions.cs | 2 ++ 7 files changed, 46 insertions(+), 11 deletions(-) diff --git a/samples/apis/Backet.Api/Controllers/BacketController.cs b/samples/apis/Backet.Api/Controllers/BacketController.cs index 489c80a..9fa2994 100644 --- a/samples/apis/Backet.Api/Controllers/BacketController.cs +++ b/samples/apis/Backet.Api/Controllers/BacketController.cs @@ -40,5 +40,12 @@ namespace Backet.Api.Controllers var grain = clusterClient.GetGrain(id); return grain.AddBacketItem("55","测试3",1000); } + [HttpPost("api/backet/RemoveFirstItem")] + public Task RemoveFirstItem() + { + var id = "da8a489fa7b4409294ee1b358fbbfba5"; + var grain = clusterClient.GetGrain(id); + return grain.RemoveFirstItem(); + } } } \ No newline at end of file diff --git a/samples/apis/Backet.Api/Domain/AggregatesModel/BacketAggregate/Backet.cs b/samples/apis/Backet.Api/Domain/AggregatesModel/BacketAggregate/Backet.cs index 731702b..02fce3e 100644 --- a/samples/apis/Backet.Api/Domain/AggregatesModel/BacketAggregate/Backet.cs +++ b/samples/apis/Backet.Api/Domain/AggregatesModel/BacketAggregate/Backet.cs @@ -28,11 +28,21 @@ namespace Backet.Api.Domain.AggregatesModel.BacketAggregate { foreach (var item in BacketItems) { - TotalPrice += item.Price; + TotalPrice = BacketItems.Sum(m=>m.Price); } } public string UserId { get; set; } public List BacketItems { get; private set; } = new List(); public long TotalPrice { get; private set; } + + internal void RemoveFirstItem() + { + var first = BacketItems.FirstOrDefault(); + if (first != null) + { + BacketItems.Remove(first); + SetBacketTotalPrice(); + } + } } } diff --git a/samples/apis/Backet.Api/Grains/Abstraction/IBacketGrain.cs b/samples/apis/Backet.Api/Grains/Abstraction/IBacketGrain.cs index 8b67a97..c605518 100644 --- a/samples/apis/Backet.Api/Grains/Abstraction/IBacketGrain.cs +++ b/samples/apis/Backet.Api/Grains/Abstraction/IBacketGrain.cs @@ -11,6 +11,7 @@ namespace Backet.Api.Grains.Abstraction Task AddBacket(BacketDto backet); Task UpdateBacket(string userId); Task AddBacketItem(string productId, string productName, long price); + Task RemoveFirstItem(); } public class BacketItemDto { diff --git a/samples/apis/Backet.Api/Grains/BacketGrain.cs b/samples/apis/Backet.Api/Grains/BacketGrain.cs index 3fe5493..3920385 100644 --- a/samples/apis/Backet.Api/Grains/BacketGrain.cs +++ b/samples/apis/Backet.Api/Grains/BacketGrain.cs @@ -37,6 +37,14 @@ namespace Backet.Api.Grains return true; } + public async Task RemoveFirstItem() + { + State.RemoveFirstItem(); + Update(State); + await WriteStateAsync(); + return true; + } + public async Task UpdateBacket(string userId) { if (State == null) return false; diff --git a/samples/apis/Backet.Api/Startup.cs b/samples/apis/Backet.Api/Startup.cs index ca4f1e5..98c92e5 100644 --- a/samples/apis/Backet.Api/Startup.cs +++ b/samples/apis/Backet.Api/Startup.cs @@ -29,14 +29,16 @@ namespace Backet.Api // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { - services.AddDbContextPool(options =>options.UseNpgsql(Configuration["postgres:write"])); + services.AddDbContextPool(options => options.UseNpgsql(Configuration["postgres:write"])); services.AddControllers(); services.ConfigureGrainStorageOptions( - options => options - .UseQuery(context => context.Backets - .Include(box => box.BacketItems) - )); + options => + { + options.UseQuery(context => context.Backets + .Include(box => box.BacketItems)); + options.IsRelatedData = true; + }); diff --git a/src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorage.cs b/src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorage.cs index 7169b0d..5660db4 100644 --- a/src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorage.cs +++ b/src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorage.cs @@ -80,16 +80,21 @@ namespace Pole.Orleans.Provider.EntityframeworkCore bool isPersisted = _options.IsPersistedFunc(entity); if (isPersisted) { - TEntity entityInDb = await _options.ReadStateAsync(context, grainReference) - .ConfigureAwait(false); - Copy(entity, entityInDb); + if (_options.IsRelatedData) + { + TEntity entityInDb = await _options.ReadStateAsync(context, grainReference) + .ConfigureAwait(false); + Copy(entity, entityInDb); + } + else + { + context.Entry(entity).State = EntityState.Modified; + } } else { context.Set().Add(entity); } - - } try diff --git a/src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorageOptions.cs b/src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorageOptions.cs index ff3795c..ccd8a42 100644 --- a/src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorageOptions.cs +++ b/src/Pole.Orleans.Provider.EntityframeworkCore/GrainStorageOptions.cs @@ -50,6 +50,8 @@ namespace Pole.Orleans.Provider.EntityframeworkCore internal Func LongKeySelector { get; set; } + public bool IsRelatedData { get; set; } + internal Func> ReadStateAsync { get; set; } internal Action SetEntity { get; set; } -- libgit2 0.25.0