Skip to content

Commit 1b772b2

Browse files
Merge pull request #132 from Lempireqc/master
fix clearTable and Add IsCaseSensitive in connection
2 parents 482863c + 258f025 commit 1b772b2

File tree

10 files changed

+258
-35
lines changed

10 files changed

+258
-35
lines changed

Main/Source/Effort.Shared/DbConnectionFactory.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public static DbConnection CreatePersistent(string instanceId)
113113
/// <returns>
114114
/// The <see cref="T:DbConnection"/> object.
115115
/// </returns>
116-
public static DbConnection CreateTransient(IDataLoader dataLoader)
116+
public static EffortConnection CreateTransient(IDataLoader dataLoader)
117117
{
118118
string instanceId = Guid.NewGuid().ToString();
119119

@@ -132,7 +132,7 @@ public static DbConnection CreateTransient(IDataLoader dataLoader)
132132
/// <returns>
133133
/// The <see cref="T:DbConnection"/> object.
134134
/// </returns>
135-
public static DbConnection CreateTransient()
135+
public static EffortConnection CreateTransient()
136136
{
137137
return CreateTransient(null);
138138
}

Main/Source/Effort.Shared/Internal/CommandActions/DbCommandActionHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public static Expression GetEnumeratorExpression(
121121
DbContainer container,
122122
out ITable table)
123123
{
124-
TransformVisitor visitor = new TransformVisitor(container.TypeConverter);
124+
TransformVisitor visitor = new TransformVisitor(container);
125125
visitor.TableProvider = container;
126126

127127
// Get the source expression

Main/Source/Effort.Shared/Internal/CommandActions/InsertCommandAction.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public DbDataReader ExecuteDataReader(ActionContext context)
6363

6464
// Collection for collection member bindings
6565
IList<MemberBinding> memberBindings = new List<MemberBinding>();
66-
TransformVisitor transform = new TransformVisitor(context.DbContainer.TypeConverter);
66+
TransformVisitor transform = new TransformVisitor(context.DbContainer);
6767

6868
// Initialize member bindings
6969
foreach (PropertyInfo property in table.EntityType.GetProperties())
@@ -110,7 +110,7 @@ public int ExecuteNonQuery(ActionContext context)
110110

111111
// Collection for collection member bindings
112112
IList<MemberBinding> memberBindings = new List<MemberBinding>();
113-
TransformVisitor transform = new TransformVisitor(context.DbContainer.TypeConverter);
113+
TransformVisitor transform = new TransformVisitor(context.DbContainer);
114114

115115
// Initialize member bindings
116116
foreach (PropertyInfo property in table.EntityType.GetProperties())

Main/Source/Effort.Shared/Internal/CommandActions/QueryCommandAction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public QueryCommandAction(DbQueryCommandTree commandTree)
5454

5555
public DbDataReader ExecuteDataReader(ActionContext context)
5656
{
57-
TransformVisitor visitor = new TransformVisitor(context.DbContainer.TypeConverter);
57+
TransformVisitor visitor = new TransformVisitor(context.DbContainer);
5858
visitor.TableProvider = context.DbContainer;
5959

6060
// Transform command tree

Main/Source/Effort.Shared/Internal/CommandActions/UpdateCommandAction.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public DbDataReader ExecuteDataReader(ActionContext context)
6767
// Collection for collection member bindings
6868
IList<MemberBinding> memberBindings = new List<MemberBinding>();
6969

70-
TransformVisitor transform = new TransformVisitor(context.DbContainer.TypeConverter);
70+
TransformVisitor transform = new TransformVisitor(context.DbContainer);
7171

7272
// Setup context for the predicate
7373
ParameterExpression param = Expression.Parameter(type, "context");
@@ -134,7 +134,7 @@ public int ExecuteNonQuery(ActionContext context)
134134
// Collection for collection member bindings
135135
IList<MemberBinding> memberBindings = new List<MemberBinding>();
136136

137-
TransformVisitor transform = new TransformVisitor(context.DbContainer.TypeConverter);
137+
TransformVisitor transform = new TransformVisitor(context.DbContainer);
138138

139139
// Setup context for the predicate
140140
ParameterExpression param = Expression.Parameter(type, "context");

Main/Source/Effort.Shared/Internal/DbCommandTreeTransformation/TransformVisitor.Comparison.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ private Expression CreateComparison(Expression left, Expression right, DbExpress
8686

8787
private Expression CreateStringComparison(Expression left, Expression right, DbExpressionKind kind)
8888
{
89+
if (this.container.IsCaseSensitive == false)
90+
{
91+
left = Expression.Call(null, StringFunctions.ToLower, left);
92+
right = Expression.Call(null, StringFunctions.ToLower, right);
93+
}
8994
var method = Expression.Call(null, StringFunctions.CompareTo, left, right);
9095
var mode = GetCompareMode(kind);
9196

@@ -136,4 +141,4 @@ private Tuple<int, bool> GetCompareMode(DbExpressionKind kind)
136141
"The ExpressionKind cannot be " + kind.ToString());
137142
}
138143
}
139-
}
144+
}

Main/Source/Effort.Shared/Internal/DbCommandTreeTransformation/TransformVisitor.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ namespace Effort.Internal.DbCommandTreeTransformation
2626
{
2727
using System;
2828
using System.Collections.Generic;
29+
using Effort.Internal.DbManagement;
2930
#if !EFOLD
3031
using System.Data.Entity.Core.Common.CommandTrees;
3132
using System.Data.Entity.Core.Metadata.Edm;
@@ -55,10 +56,12 @@ internal partial class TransformVisitor : DbExpressionVisitor<Expression>
5556
private EdmTypeConverter edmTypeConverter;
5657

5758
private VariableCollection currentVariables;
59+
private DbContainer container;
5860

59-
public TransformVisitor(ITypeConverter converter)
61+
public TransformVisitor(DbContainer container)
6062
{
61-
this.converter = converter;
63+
this.container = container;
64+
this.converter = container.TypeConverter;
6265
this.edmTypeConverter = new EdmTypeConverter(converter);
6366

6467
this.queryMethodExpressionBuilder = new LinqMethodExpressionBuilder();

Main/Source/Effort.Shared/Internal/DbManagement/DbContainer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ internal class DbContainer : ITableProvider
5454
private List<TableName> tableNames;
5555
private ITypeConverter converter;
5656
private DbContainerParameters parameters;
57-
5857
private ILogger logger;
5958
private ConcurrentDictionary<string, IStoredProcedure> transformCache;
6059

@@ -92,6 +91,8 @@ public ConcurrentDictionary<string, IStoredProcedure> TransformCache
9291
{
9392
get { return this.transformCache; }
9493
}
94+
95+
public bool IsCaseSensitive { get; set; } = true;
9596

9697
public ITypeConverter TypeConverter
9798
{

Main/Source/Effort.Shared/Provider/EffortConnection.cs

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
// </copyright>
2323
// --------------------------------------------------------------------------------------------
2424

25+
26+
using System.Data.Entity;
2527
using System.Linq;
2628
using System.Reflection;
2729
using Effort.Internal.CommandActions;
@@ -59,22 +61,60 @@ public EffortConnection()
5961
this.state = ConnectionState.Closed;
6062
}
6163

64+
public bool IsCaseSensitive
65+
{
66+
get
67+
{
68+
if (this.DbContainer != null)
69+
{
70+
return this.DbContainer.IsCaseSensitive;
71+
}
72+
else
73+
{
74+
throw new Exception("The connection must be open to gets or sets 'IsCaseSensitive' value. Please open the connection first with 'effortConnection.Open()'");
75+
}
76+
}
77+
set
78+
{
79+
if (this.DbContainer != null)
80+
{
81+
this.DbContainer.IsCaseSensitive = value;
82+
}
83+
else
84+
{
85+
throw new Exception("The connection must be open to gets or sets 'IsCaseSensitive' value. Please open the connection first with 'effortConnection.Open()'");
86+
}
87+
}
88+
}
89+
90+
#if !EFOLD
91+
/// <summary>
92+
/// Clear all tables from the effort connection. You must use a new context instance to clear all tracked entities, otherwise, use the ClearTables(DbContext) overload.
93+
/// </summary>
6294
public void ClearTables()
63-
{
95+
{
96+
ClearTables(null);
97+
}
98+
99+
/// <summary>
100+
/// Clear all tables from the effort connection and ChangeTracker entries.
101+
/// </summary>
102+
public void ClearTables(DbContext context)
103+
{
64104
if (this.DbContainer != null)
65-
{
66-
ActionContext context = new ActionContext(this.DbContainer);
105+
{
106+
ActionContext actionContext = new ActionContext(this.DbContainer);
67107

68-
var tables = DbCommandActionHelper.GetAllTables(context.DbContainer).ToList().Where(x => !x.EntityType.Name.Contains("_____MigrationHistory")).ToList();
108+
var tables = DbCommandActionHelper.GetAllTables(actionContext.DbContainer).ToList().Where(x => !x.EntityType.Name.Contains("_____MigrationHistory")).ToList();
69109

70110
foreach (var table in tables)
71111
{
72112
foreach (var index in table.Indexes)
73-
{
113+
{
74114
index.Clear();
75115
}
76116

77-
var _RestoreIdentityField = table.GetType().GetMethod("RestoreIdentityField",
117+
var _RestoreIdentityField = table.GetType().GetMethod("RestoreIdentityField",
78118
BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static |
79119
BindingFlags.FlattenHierarchy);
80120

@@ -85,9 +125,19 @@ public void ClearTables()
85125
BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static |
86126
BindingFlags.FlattenHierarchy, null, null, null);
87127
}
88-
}
128+
}
129+
130+
if (context != null)
131+
{
132+
var changedEntriesCopy = context.ChangeTracker.Entries()
133+
.ToList();
134+
135+
foreach (var entry in changedEntriesCopy)
136+
entry.State = EntityState.Detached;
137+
}
89138
}
90139
}
140+
#endif
91141

92142
/// <summary>
93143
/// Gets or sets the string used to open the connection.

0 commit comments

Comments
 (0)