我正在使用带有MySQL数据库的Entity Framework 6,它包含许多映射到NCHAR列的固定宽度字段。在所有情况下,当我设置固定宽度字段的值时,我使用一个长度等于该字段宽度的字符串。其中一些字符串包含尾随空格。但是,当我从数据库中检索这些值时,尾随空格消失了,字符串比它们应该短得多。有没有办法阻止这种行为?
答案 0 :(得分:0)
结果there's a SQL mode for that.为了使其在Entity Framework中运行,我必须执行以下操作:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using MySql.Data.Entity;
[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class MyModel : DbContext
{
protected internal MyModel() : base("name=MyModel") { }
public static MyModel Create()
{
var model = new MyModel();
try
{
model.Database.ExecuteSqlCommand(
"SET SESSION sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';");
}
catch
{
model.Dispose();
throw;
}
return model;
}
// other MyModel members
}
public sealed class MyContextFactory : IDbContextFactory<MyModel>
{
MyModel IDbContextFactory<MyModel>.Create()
{
return new MyModel();
}
}
然后我通过调用MyModel()
将我的代码库中的所有调用替换为public
构造函数(之前为protected internal
而不是MyModel.Create()
)。
我必须创建一个单独的Create()
静态方法而不是仅仅在构造函数中调用ExecuteSqlCommand
的原因是ExecuteSqlCommand
打破了代码优先迁移。由于MyModel
不再具有公共默认构造函数,因此代码优先迁移将实例化MyContextFactory
并调用其Create()
方法,该方法不会调用ExecuteSqlCommand
。这没关系,因为与实际的应用程序代码不同,迁移工作正常而不改变SQL模式。
执行此操作的另一种方法是在数据库设置时执行SQL语句SET GLOBAL sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
,可能是在迁移中使用Sql
方法。我没有这样做,因为它影响整个数据库服务器,而不仅仅是一个特定的数据库,而且我正在与其他代码我不想冒险破解的人共享MySQL服务器。