-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathEfDbModel.Create.cs
More file actions
77 lines (64 loc) · 3.81 KB
/
Copy pathEfDbModel.Create.cs
File metadata and controls
77 lines (64 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
namespace CoreEx.EntityFrameworkCore;
public partial class EfDbModel<TModel>
{
/// <summary>
/// Creates the <paramref name="model"/>.
/// </summary>
/// <param name="model">The model.</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
/// <returns>The <see cref="DataResult{TModel}"/> containing the created model.</returns>
public Task<DataResult<TModel>> CreateAsync(TModel model, CancellationToken cancellationToken = default) => CreateAsync(Args, model, cancellationToken);
/// <summary>
/// Creates the <paramref name="model"/>.
/// </summary>
/// <param name="args">The <see cref="EfDbArgs"/>.</param>
/// <param name="model">The model.</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
/// <returns>The <see cref="DataResult{TModel}"/> containing the created model.</returns>
public async Task<DataResult<TModel>> CreateAsync(EfDbArgs args, TModel model, CancellationToken cancellationToken = default) => (await CreateWithResultInternalAsync(args, model, nameof(CreateAsync), cancellationToken).ConfigureAwait(false)).Value;
/// <summary>
/// Creates the <paramref name="model"/>.
/// </summary>
/// <param name="model">The model.</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
/// <returns>The <see cref="DataResult{TModel}"/> containing the created model.</returns>
public Task<Result<DataResult<TModel>>> CreateWithResultAsync(TModel model, CancellationToken cancellationToken = default) => CreateWithResultAsync(Args, model, cancellationToken);
/// <summary>
/// Creates the <paramref name="model"/>.
/// </summary>
/// <param name="args">The <see cref="EfDbArgs"/>.</param>
/// <param name="model">The model.</param>
/// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
/// <returns>The <see cref="DataResult{TModel}"/> containing the created model.</returns>
public Task<Result<DataResult<TModel>>> CreateWithResultAsync(EfDbArgs args, TModel model, CancellationToken cancellationToken = default) => CreateWithResultInternalAsync(args, model, nameof(CreateWithResultAsync), cancellationToken);
/// <summary>
/// Creates the model (internal).
/// </summary>
private async Task<Result<DataResult<TModel>>> CreateWithResultInternalAsync(EfDbArgs args, TModel model, string memberName, CancellationToken cancellationToken)
{
model.ThrowIfNull();
if (model is IReadOnlyLogicallyDeleted ld && ld.IsDeleted)
throw new InvalidOperationException($"Cannot create a model with a deleted state; {nameof(ILogicallyDeleted.IsDeleted)} must be false.");
args.CheckRefreshAndSaveChangesCombination();
return await EfDb.Invoker.InvokeAsync(EfDb, args, async (_, args, cancellationToken) =>
{
// Prepare the model.
var br = Options.OnBeforeCreateOrUpdate(model, OperationType.Create);
if (br.IsFailure)
return br;
Mapper.MapChangeLogInto(ChangeLog.Empty, model);
Model.PrepareCreate(model, EfDb.ExecutionContext);
// Check model is valid.
var r = CheckModel(args, model, OperationType.Create);
if (r.IsFailure)
return r.Bind();
// EF add (create).
EfDb.DbContext.Add(model);
if (args.SaveChanges)
await EfDb.DbContext.SaveChangesAsync(true, cancellationToken).ConfigureAwait(false);
// Refresh as required.
var pr = await RefreshPostMutationAsync(args, model, memberName, cancellationToken).ConfigureAwait(false);
return pr.ThenAs(m => new DataResult<TModel>(m, true));
}, cancellationToken, memberName).ConfigureAwait(false);
}
}