diff --git a/Source/EntityFramework.Extended/Batch/MySqlBatchRunner.cs b/Source/EntityFramework.Extended/Batch/MySqlBatchRunner.cs index 7b76fd9..2210a54 100644 --- a/Source/EntityFramework.Extended/Batch/MySqlBatchRunner.cs +++ b/Source/EntityFramework.Extended/Batch/MySqlBatchRunner.cs @@ -103,7 +103,7 @@ private int InternalDelete(ObjectContext objectContext, EntityMap entit sqlBuilder.Append("DELETE j0"); sqlBuilder.AppendLine(); - sqlBuilder.AppendFormat("FROM {0} AS j0 INNER JOIN (", entityMap.TableName); + sqlBuilder.AppendFormat("FROM {0} AS j0 INNER JOIN (", QuoteIdentifier(entityMap.TableName)); sqlBuilder.AppendLine(); sqlBuilder.AppendLine(innerSelect); sqlBuilder.Append(") AS j1 ON ("); @@ -119,7 +119,7 @@ private int InternalDelete(ObjectContext objectContext, EntityMap entit } sqlBuilder.Append(")"); - deleteCommand.CommandText = sqlBuilder.ToString().Replace("[", "").Replace("]", ""); + deleteCommand.CommandText = sqlBuilder.ToString().Replace("[", "`").Replace("]", "`"); #if NET45 int result = async @@ -230,7 +230,7 @@ private int InternalUpdate(ObjectContext objectContext, EntityMap entit sqlBuilder.Append("UPDATE "); sqlBuilder.Append(entityMap.TableName); - sqlBuilder.AppendFormat(" AS j0 INNER JOIN (", entityMap.TableName); + sqlBuilder.AppendFormat(" AS j0 INNER JOIN (", QuoteIdentifier(entityMap.TableName)); sqlBuilder.AppendLine(); sqlBuilder.AppendLine(innerSelect); sqlBuilder.Append(") AS j1 ON ("); @@ -449,5 +449,10 @@ private static string GetSelectSql(ObjectQuery query, EntityMa return innerJoinSql; } + + private static string QuoteIdentifier(string name) + { + return ("`" + name + "`"); + } } } \ No newline at end of file diff --git a/Source/EntityFramework.Extended/Batch/SqlServerBatchRunner.cs b/Source/EntityFramework.Extended/Batch/SqlServerBatchRunner.cs index 8f2fbb0..499879c 100644 --- a/Source/EntityFramework.Extended/Batch/SqlServerBatchRunner.cs +++ b/Source/EntityFramework.Extended/Batch/SqlServerBatchRunner.cs @@ -97,13 +97,21 @@ private int InternalDelete(ObjectContext objectContext, EntityMap entit var innerSelect = GetSelectSql(query, entityMap, deleteCommand); + string tableName; + if (entityMap.SchemaName != null) + { + tableName = QuoteIdentifier(entityMap.SchemaName) + '.' + QuoteIdentifier(entityMap.TableName); + } + else + tableName = QuoteIdentifier(entityMap.TableName); + var sqlBuilder = new StringBuilder(innerSelect.Length * 2); sqlBuilder.Append("DELETE "); - sqlBuilder.Append(entityMap.TableName); + sqlBuilder.Append(tableName); sqlBuilder.AppendLine(); - sqlBuilder.AppendFormat("FROM {0} AS j0 INNER JOIN (", entityMap.TableName); + sqlBuilder.AppendFormat("FROM {0} AS j0 INNER JOIN (", tableName); sqlBuilder.AppendLine(); sqlBuilder.AppendLine(innerSelect); sqlBuilder.Append(") AS j1 ON ("); @@ -223,11 +231,18 @@ private int InternalUpdate(ObjectContext objectContext, EntityMap entit if (objectContext.CommandTimeout.HasValue) updateCommand.CommandTimeout = objectContext.CommandTimeout.Value; + string tableName; + if (entityMap.SchemaName != null) + { + tableName = QuoteIdentifier(entityMap.SchemaName) + '.' + QuoteIdentifier(entityMap.TableName); + } + else + tableName = QuoteIdentifier(entityMap.TableName); var innerSelect = GetSelectSql(query, entityMap, updateCommand); var sqlBuilder = new StringBuilder(innerSelect.Length * 2); sqlBuilder.Append("UPDATE "); - sqlBuilder.Append(entityMap.TableName); + sqlBuilder.Append(tableName); sqlBuilder.AppendLine(" SET "); var memberInitExpression = updateExpression.Body as MemberInitExpression; @@ -347,7 +362,7 @@ private int InternalUpdate(ObjectContext objectContext, EntityMap entit } sqlBuilder.AppendLine(" "); - sqlBuilder.AppendFormat("FROM {0} AS j0 INNER JOIN (", entityMap.TableName); + sqlBuilder.AppendFormat("FROM {0} AS j0 INNER JOIN (", tableName); sqlBuilder.AppendLine(); sqlBuilder.AppendLine(innerSelect); sqlBuilder.Append(") AS j1 ON ("); @@ -449,5 +464,10 @@ private static string GetSelectSql(ObjectQuery query, EntityMa return innerJoinSql; } + + private static string QuoteIdentifier(string name) + { + return ("[" + name.Replace("]", "]]") + "]"); + } } } \ No newline at end of file diff --git a/Source/EntityFramework.Extended/Mapping/EntityMap.cs b/Source/EntityFramework.Extended/Mapping/EntityMap.cs index c338452..af158b4 100644 --- a/Source/EntityFramework.Extended/Mapping/EntityMap.cs +++ b/Source/EntityFramework.Extended/Mapping/EntityMap.cs @@ -57,6 +57,14 @@ public Type EntityType /// public string TableName { get; set; } + /// + /// Gets or sets the name of the schema + /// + /// + /// The name of the schema (usually `dbo` on MS SQL Server) + /// + public string SchemaName { get; set; } + private readonly List _propertyMaps; /// /// Gets the property maps. diff --git a/Source/EntityFramework.Extended/Mapping/MetadataMappingProvider.cs b/Source/EntityFramework.Extended/Mapping/MetadataMappingProvider.cs index 6c9235a..1c66284 100644 --- a/Source/EntityFramework.Extended/Mapping/MetadataMappingProvider.cs +++ b/Source/EntityFramework.Extended/Mapping/MetadataMappingProvider.cs @@ -59,7 +59,9 @@ public EntityMap GetEntityMap(Type type, ObjectContext objectContext) var entityMap = new EntityMap(type); var metadata = objectContext.MetadataWorkspace; + // Get the part of the model that contains info about the actual CLR types var objectItemCollection = ((ObjectItemCollection)metadata.GetItemCollection(DataSpace.OSpace)); + var entityType = metadata.GetItems(DataSpace.OSpace).Single(e => objectItemCollection.GetClrType(e) == type); var entitySet = metadata.GetItems(DataSpace.CSpace) @@ -186,8 +188,6 @@ private static void SetProperties(EntityMap entityMap, EntitySetMapping mapping, private static void SetTableName(EntityMap entityMap) { - var builder = new StringBuilder(50); - EntitySet storeSet = entityMap.StoreSet; string table = null; @@ -226,20 +226,9 @@ private static void SetTableName(EntityMap entityMap) schema = schemaProperty.Value as string; } - if (!string.IsNullOrWhiteSpace(schema)) - { - builder.Append(QuoteIdentifier(schema)); - builder.Append("."); - } - - builder.Append(QuoteIdentifier(table)); - - entityMap.TableName = builder.ToString(); + entityMap.SchemaName = schema; + entityMap.TableName = table; } - private static string QuoteIdentifier(string name) - { - return ("[" + name.Replace("]", "]]") + "]"); - } } -} \ No newline at end of file +} diff --git a/Source/Samples/net40/Tracker.SqlServer.Test/MappingObjectContext.cs b/Source/Samples/net40/Tracker.SqlServer.Test/MappingObjectContext.cs index 45c46f3..6f25e19 100644 --- a/Source/Samples/net40/Tracker.SqlServer.Test/MappingObjectContext.cs +++ b/Source/Samples/net40/Tracker.SqlServer.Test/MappingObjectContext.cs @@ -37,7 +37,8 @@ public void GetEntityMapAuditData() //var map = db.Audits.ToObjectQuery().GetEntityMap(); - Assert.Equal("[dbo].[Audit]", map.TableName); + Assert.Equal("dbo",map.SchemaName); + Assert.Equal("Audit", map.TableName); } @@ -51,7 +52,8 @@ public void GetInheritedEntityMapAuditData() //var map = db.Audits.ToObjectQuery().GetEntityMap(); - Assert.Equal("[dbo].[Task]", map.TableName); + Assert.Equal("dbo", map.SchemaName); + Assert.Equal("Task", map.TableName); } } diff --git a/Source/Samples/net45/Tracker.SqlServer.Test/MappingObjectContext.cs b/Source/Samples/net45/Tracker.SqlServer.Test/MappingObjectContext.cs index 45c46f3..562c1bb 100644 --- a/Source/Samples/net45/Tracker.SqlServer.Test/MappingObjectContext.cs +++ b/Source/Samples/net45/Tracker.SqlServer.Test/MappingObjectContext.cs @@ -12,7 +12,7 @@ namespace Tracker.SqlServer.Test /// /// Summary description for MappingObjectContext /// - + public class MappingObjectContext { [Fact] @@ -37,7 +37,8 @@ public void GetEntityMapAuditData() //var map = db.Audits.ToObjectQuery().GetEntityMap(); - Assert.Equal("[dbo].[Audit]", map.TableName); + Assert.Equal("Audit", map.TableName); + Assert.Equal("dbo", map.SchemaName); } @@ -51,7 +52,8 @@ public void GetInheritedEntityMapAuditData() //var map = db.Audits.ToObjectQuery().GetEntityMap(); - Assert.Equal("[dbo].[Task]", map.TableName); + Assert.Equal("Task", map.TableName); + Assert.Equal("dbo", map.SchemaName); } }