benjaminvr

FakeDbSet 2.0

Jul 4th, 2022
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. using Microsoft.EntityFrameworkCore;
  2. using Microsoft.EntityFrameworkCore.ChangeTracking;
  3. using Microsoft.EntityFrameworkCore.Metadata;
  4. using System.Collections;
  5. using System.ComponentModel.DataAnnotations;
  6. using System.Linq.Expressions;
  7. using System.Reflection;
  8.  
  9. namespace Datalayer {
  10. public class FakeDbSet<T> : DbSet<T>, IQueryable, IEnumerable<T> where T : class {
  11. List<T> _data;
  12.  
  13. public FakeDbSet(List<T> items = null) {
  14. _data = items ?? new List<T>();
  15. }
  16.  
  17. public void SetCollection(List<T> collection) {
  18. this.Clear();
  19. this.AddRange(collection);
  20. }
  21.  
  22. public void SetSingle(T item) {
  23. this.Clear();
  24. this.Add(item);
  25. }
  26.  
  27. public void Clear() {
  28. _data = new();
  29. }
  30.  
  31. public override T Find(params object[] keyValues) {
  32. foreach (var obj in keyValues) {
  33. PropertyInfo[] properties = typeof(T).GetProperties();
  34.  
  35. foreach (PropertyInfo property in properties) {
  36. var attribute = Attribute.GetCustomAttribute(property, typeof(KeyAttribute)) as KeyAttribute;
  37.  
  38. if (attribute != null) {
  39. foreach (var entity in _data) {
  40. if ((property.GetValue(entity) ?? "").ToString() == obj.ToString()) {
  41. return entity;
  42. }
  43. }
  44. }
  45. }
  46. }
  47.  
  48. return null;
  49. }
  50.  
  51. public override EntityEntry<T> Add(T item) {
  52. _data.Add(item);
  53. return item as EntityEntry<T>;
  54. }
  55.  
  56. public override EntityEntry<T> Remove(T item) {
  57. _data.Remove(item);
  58. return item as EntityEntry<T>;
  59. }
  60.  
  61. public override EntityEntry<T> Attach(T item) {
  62. return null;
  63. }
  64.  
  65. public T Detach(T item) {
  66. _data.Remove(item);
  67. return item;
  68. }
  69.  
  70. public T Create() {
  71. return Activator.CreateInstance<T>();
  72. }
  73.  
  74. public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T {
  75. return Activator.CreateInstance<TDerivedEntity>();
  76. }
  77.  
  78. public new List<T> Local {
  79. get { return _data; }
  80. }
  81.  
  82. public override IEntityType EntityType => throw new NotImplementedException();
  83.  
  84. public override void AddRange(IEnumerable<T> entities) {
  85. _data.AddRange(entities);
  86. }
  87.  
  88. public override void RemoveRange(IEnumerable<T> entities) {
  89. for (int i = entities.Count() - 1; i >= 0; i--) {
  90. T entity = entities.ElementAt(i);
  91. if (_data.Contains(entity)) {
  92. Remove(entity);
  93. }
  94. }
  95.  
  96. }
  97.  
  98. Type IQueryable.ElementType {
  99. get { return _data.AsQueryable().ElementType; }
  100. }
  101.  
  102. Expression IQueryable.Expression {
  103. get { return _data.AsQueryable().Expression; }
  104. }
  105.  
  106. IQueryProvider IQueryable.Provider {
  107. get { return _data.AsQueryable().Provider; }
  108. }
  109.  
  110. IEnumerator IEnumerable.GetEnumerator() {
  111. return _data.GetEnumerator();
  112. }
  113.  
  114. IEnumerator<T> IEnumerable<T>.GetEnumerator() {
  115. return _data.GetEnumerator();
  116. }
  117.  
  118. }
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment