-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathAutoCrudRepository.cs
122 lines (101 loc) · 3.56 KB
/
AutoCrudRepository.cs
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
namespace AutoCrud
{
public abstract class AutoCrudRepository<Entity, PrimaryKey> : IAutoCrudRepository<Entity, PrimaryKey>
where Entity : class
{
private readonly DbContext _dbContext;
protected AutoCrudRepository(DbContext dbContext)
{
_dbContext = dbContext;
}
// ReSharper disable once UnusedParameter.Global
protected virtual void PreProcessCreate(Entity entity)
{
}
public async Task<Entity> CreateAsync(Entity entity)
{
PreProcessCreate(entity);
var entry = await GetDbSet().AddAsync(entity);
await _dbContext.SaveChangesAsync();
return entry.Entity;
}
public Entity Create(Entity entity)
{
PreProcessCreate(entity);
var entry = GetDbSet().Add(entity);
_dbContext.SaveChanges();
return entry.Entity;
}
// ReSharper disable once UnusedParameter.Global
protected virtual void PreProcessUpdate(Entity entity)
{
}
public async Task<Entity> UpdateAsync(Entity entity)
{
var existingEntity = await FindAsync(GetPrimaryKey(entity));
var entry = GetDbSet().Update(existingEntity);
PreProcessUpdate(entity);
SetUpdatedValues(entry, entity);
await _dbContext.SaveChangesAsync();
return entry.Entity;
}
public Entity Update(Entity entity)
{
var existingEntity = Find(GetPrimaryKey(entity));
var entry = GetDbSet().Update(existingEntity);
PreProcessUpdate(entity);
SetUpdatedValues(entry, entity);
_dbContext.SaveChanges();
return entry.Entity;
}
protected virtual void SetUpdatedValues(EntityEntry<Entity> entry, Entity toUpdate)
{
entry.CurrentValues.SetValues(toUpdate);
}
public async Task<Entity> DeleteAsync(PrimaryKey key)
{
var video = await FindAsync(key);
var entry = GetDbSet().Remove(video);
await _dbContext.SaveChangesAsync();
return entry.Entity;
}
public Entity Delete(PrimaryKey key)
{
var video = Find(key);
var entry = GetDbSet().Remove(video);
_dbContext.SaveChangesAsync();
return entry.Entity;
}
public async Task<Entity> FindAsync(PrimaryKey key)
{
return await GetDbSet().FindAsync(key);
}
public Entity Find(PrimaryKey key)
{
return GetDbSet().Find(key);
}
public async Task<List<Entity>> GetPageAsync(int page, int pageSize)
{
var query = GetDbSet().Take(pageSize).Skip(page * pageSize);
query = PreProcessPageQuery(query);
return await query.ToListAsync();
}
public List<Entity> GetPage(int page, int pageSize)
{
var query = GetDbSet().Skip(page * pageSize).Take(pageSize);
query = PreProcessPageQuery(query);
return query.ToList();
}
protected virtual IQueryable<Entity> PreProcessPageQuery(IQueryable<Entity> query)
{
return query;
}
protected abstract DbSet<Entity> GetDbSet();
protected abstract PrimaryKey GetPrimaryKey(Entity entity);
}
}