This repository was archived by the owner on Jul 6, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathSampleContext.cs
82 lines (71 loc) · 2.89 KB
/
SampleContext.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
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using EFSecondLevelCache.TestDataLayer.Models;
namespace EFSecondLevelCache.TestDataLayer.DataLayer
{
public static class ChangeTrackerExtenstions
{
public static string[] GetChangedEntityNames(this DbContext dbContext)
{
if (!dbContext.Configuration.AutoDetectChangesEnabled)
{
dbContext.ChangeTracker.DetectChanges();
}
var typesList = new List<Type>();
foreach (var type in dbContext.getChangedEntityTypes())
{
typesList.Add(type);
typesList.AddRange(type.getBaseTypes().ToList());
}
var changedEntityNames = typesList
.Select(type => System.Data.Entity.Core.Objects.ObjectContext.GetObjectType(type).FullName)
.Distinct()
.ToArray();
return changedEntityNames;
}
private static IEnumerable<Type> getBaseTypes(this Type type)
{
if (type.BaseType == null) return type.GetInterfaces();
return Enumerable.Repeat(type.BaseType, 1)
.Concat(type.GetInterfaces())
.Concat(type.GetInterfaces().SelectMany(getBaseTypes))
.Concat(type.BaseType.getBaseTypes());
}
private static IEnumerable<Type> getChangedEntityTypes(this DbContext dbContext)
{
return dbContext.ChangeTracker.Entries().Where(
dbEntityEntry => dbEntityEntry.State == EntityState.Added ||
dbEntityEntry.State == EntityState.Modified ||
dbEntityEntry.State == EntityState.Deleted)
.Select(dbEntityEntry => System.Data.Entity.Core.Objects.ObjectContext.GetObjectType(dbEntityEntry.Entity.GetType()));
}
}
public class SampleContext : DbContext
{
public SampleContext()
: base("connectionString1")
{
}
// This is virtual because Moq needs to override the behavior.
public virtual DbSet<Post> Posts { get; set; }
public virtual DbSet<Product> Products { get; set; }
public virtual DbSet<Tag> Tags { get; set; }
public virtual DbSet<User> Users { get; set; }
public int SaveAllChanges(bool invalidateCacheDependencies = true)
{
var changedEntityNames = this.GetChangedEntityNames();
var result = base.SaveChanges();
if (invalidateCacheDependencies)
{
new EFCacheServiceProvider().InvalidateCacheDependencies(changedEntityNames);
}
return result;
}
public override int SaveChanges()
{
return SaveAllChanges(invalidateCacheDependencies: true);
}
}
}