不要从Entity Framework中的固定宽度列中剥离空格

时间:2016-01-08 17:03:47

标签: c# mysql entity-framework entity-framework-6

我正在使用带有MySQL数据库的Entity Framework 6,它包含许多映射到NCHAR列的固定宽度字段。在所有情况下,当我设置固定宽度字段的值时,我使用一个长度等于该字段宽度的字符串。其中一些字符串包含尾随空格。但是,当我从数据库中检索这些值时,尾随空格消失了,字符串比它们应该短得多。有没有办法阻止这种行为?

1 个答案:

答案 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服务器。