| Bug #73205 | Schema name not used by EF | ||
|---|---|---|---|
| Submitted: | 5 Jul 2014 11:55 | Modified: | 5 Feb 2016 13:18 |
| Reporter: | Laredo Tirnanic | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | Connector / NET | Severity: | S3 (Non-critical) |
| Version: | 6.8.3.0, 6.9.8 | OS: | Windows |
| Assigned to: | CPU Architecture: | Any | |
[13 Nov 2014 11:30]
Chiranjeevi Battula
Hello Laredo Tirnanic, Thank you for the bug report. I could not repeat the issue on Visual Studio 2013 (C#.Net) with MySQL Connector/Net 6.9.3. Could you please provide complete repeatable test case to confirm this issue at our end? Thanks, Chiranjeevi.
[14 Dec 2014 1:00]
Bugs System
No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open".
[26 Jan 2016 22:07]
Kai Scheddin
May it could be an equal fix to the bug #80156 (http://bugs.mysql.com/bug.php?id=80156) at TableFragment.cs.
[5 Feb 2016 13:18]
Chiranjeevi Battula
Hello Laredo Tirnanic, Thank you for your feedback. Verified this behavior on Visual Studio 2013 (C#.Net) with MySQL Connector/Net 6.9.8. Thanks, Chiranjeevi.
[5 Feb 2016 13:21]
Chiranjeevi Battula
http://bugs.mysql.com/bug.php?id=80156 marked as duplicate of this one.
[5 Aug 2016 21:05]
Spartak Timchev
Same behavior confirmed on version 6.9.9
[4 Jul 2017 10:29]
Piotr Qx
I appears this issue still exists in the code and it's an easy fix. I fixed it locally with the following code which I will submit but need to know when will the fix be released.
I changed the method as follows. I'm not sure why it hasn't been fixed in over a year and new branches have the issue too.
public override void WriteSql(StringBuilder sql)
{
if (DefiningQuery != null)
{
sql.AppendFormat("({0})", DefiningQuery);
}
else
{
string schemaName = Schema;
string tableName = QuoteIdentifier(Table);
if (schemaName.ToLowerInvariant().Equals("dbo"))
{
schemaName = "";
}
if (!string.IsNullOrEmpty(schemaName) && !string.IsNullOrWhiteSpace(schemaName))
{
tableName = string.Format("{0}.{1}",QuoteIdentifier(Schema), tableName);
}
sql.AppendFormat("{0}", QuoteIdentifier(tableName));
}
base.WriteSql(sql);
}

Description: When using EF (code first) I mapped a table(test) to a schema called core. modelBuilder.Entity<Test>().Map(x => x.ToTable("test", "core")); When I run update-database it creates a table called core.test as expected. However when I try and access context.Tests it still seems to be mapped to 'test1.test'. So it seems to be ignoring the schema. I have tested this with Mssql and it works as expected there. How to repeat: public class Test { public int Id { get; set; } public string Description { get; set; } } [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class MySqlDbContext : DbContext { public DbSet<Test> Tests { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); //Todo: Add index information, more relationships, etc modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Entity<Test>().Map(x => x.ToTable("test", "core")); } public MySqlDbContext() : base("name=CodeFirst") { } } internal sealed class Configuration : DbMigrationsConfiguration<MySqlDbContext> { public Configuration() { AutomaticMigrationsEnabled = true; ContextKey = "DataServices.Server.Domain.Repositories.nFrallAppMSSQLDbContext1"; AutomaticMigrationDataLossAllowed = true; SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); CodeGenerator = new MySql.Data.Entity.MySqlMigrationCodeGenerator(); } } In package manager run: update-database -verbose This will create the table as expected. In global.asax.cs add the following: MySqlDbContext context = new MySqlDbContext(); context.Database.Initialize(false); var b = context.Tests.Any(a => a.Description == "Hello"); When querying Tests it will give an error that it can't find the table 'test1.test'. It should be searching for 'test1.core.test'