Skip to content

Commit 2f6bb96

Browse files
Closes #36 - Performance changes to the in-memory repository
1 parent 91c6d20 commit 2f6bb96

File tree

1 file changed

+32
-13
lines changed

1 file changed

+32
-13
lines changed

src/DotNetToolkit.Repository.InMemory/InMemoryRepositoryBase.cs

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -164,17 +164,23 @@ protected override void AddItem(TEntity entity)
164164
.Select(x => x.Key)
165165
.SingleOrDefault();
166166

167+
var hasTemporaryKey = false;
168+
167169
if (key != null && key.Equals(default(TKey)))
168170
{
169171
key = GetPrimaryKey(entity);
170172

171173
if (key != null && key.Equals(default(TKey)))
172174
{
173175
key = GenerateTemporaryPrimaryKey();
176+
hasTemporaryKey = true;
174177
}
175178
}
176179

177-
_context[key] = new EntitySet<TEntity, TKey>(entity, key, EntityState.Added);
180+
_context[key] = new EntitySet<TEntity, TKey>(entity, key, EntityState.Added)
181+
{
182+
HasTemporaryKey = hasTemporaryKey
183+
};
178184
}
179185

180186
/// <summary>
@@ -183,13 +189,18 @@ protected override void AddItem(TEntity entity)
183189
protected override void DeleteItem(TEntity entity)
184190
{
185191
var key = GetPrimaryKey(entity);
192+
var hasTemporaryKey = false;
186193

187194
if (key != null && key.Equals(default(TKey)))
188195
{
189196
key = GenerateTemporaryPrimaryKey();
197+
hasTemporaryKey = true;
190198
}
191199

192-
_context[key] = new EntitySet<TEntity, TKey>(entity, key, EntityState.Removed);
200+
_context[key] = new EntitySet<TEntity, TKey>(entity, key, EntityState.Removed)
201+
{
202+
HasTemporaryKey = hasTemporaryKey
203+
};
193204
}
194205

195206
/// <summary>
@@ -198,13 +209,18 @@ protected override void DeleteItem(TEntity entity)
198209
protected override void UpdateItem(TEntity entity)
199210
{
200211
var key = GetPrimaryKey(entity);
212+
var hasTemporaryKey = false;
201213

202214
if (key != null && key.Equals(default(TKey)))
203215
{
204216
key = GenerateTemporaryPrimaryKey();
217+
hasTemporaryKey = true;
205218
}
206219

207-
_context[key] = new EntitySet<TEntity, TKey>(entity, key, EntityState.Modified);
220+
_context[key] = new EntitySet<TEntity, TKey>(entity, key, EntityState.Modified)
221+
{
222+
HasTemporaryKey = hasTemporaryKey
223+
};
208224
}
209225

210226
/// <summary>
@@ -218,29 +234,28 @@ protected override void SaveChanges()
218234

219235
foreach (var entitySet in _context.Select(y => y.Value))
220236
{
221-
var temporaryKey = entitySet.Key;
222-
var key = GetPrimaryKey(entitySet.Entity);
237+
var key = entitySet.Key;
223238

224239
if (entitySet.State == EntityState.Added)
225240
{
226-
if (key == null || key.Equals(default(TKey)))
241+
if (entitySet.HasTemporaryKey)
227242
{
228243
key = GeneratePrimaryKey();
229244
SetPrimaryKey(entitySet.Entity, key);
230245
}
231-
else if (context.ContainsKey(temporaryKey))
246+
else if (context.ContainsKey(key))
232247
{
233248
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.EntityAlreadyBeingTrackedInStore, entitySet.Entity.GetType()));
234249
}
235250
}
236-
else if (!context.ContainsKey(temporaryKey))
251+
else if (!context.ContainsKey(key))
237252
{
238253
throw new InvalidOperationException(Resources.EntityNotFoundInStore);
239254
}
240255

241256
if (entitySet.State == EntityState.Removed)
242257
{
243-
context.Remove(temporaryKey);
258+
context.Remove(key);
244259
}
245260
else
246261
{
@@ -261,8 +276,8 @@ protected override IQueryable<TEntity> GetQuery(IFetchStrategy<TEntity> fetchStr
261276
{
262277
return InMemoryCache<TEntity, TKey>.Instance
263278
.GetContext(DatabaseName)
264-
.AsQueryable()
265-
.Select(y => y.Value);
279+
.Select(y => y.Value)
280+
.AsQueryable();
266281
}
267282

268283
/// <summary>
@@ -320,6 +335,11 @@ public EntitySet(TEntity entity, TKey key, EntityState state)
320335
/// </summary>
321336
public EntityState State { get; }
322337

338+
/// <summary>
339+
/// Gets or sets a value indicating whether this instance has a temporary key.
340+
/// </summary>
341+
public bool HasTemporaryKey { get; set; }
342+
323343
#endregion
324344
}
325345

@@ -334,8 +354,7 @@ private enum EntityState
334354
{
335355
Added,
336356
Removed,
337-
Modified,
338-
Unchanged
357+
Modified
339358
}
340359

341360
#endregion

0 commit comments

Comments
 (0)