c# - 不要从 Entity Framework 中的固定宽度列中去除空格

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

我将 Entity Framework 6 与 MySQL 数据库结合使用,它包含许多映射到 NCHAR 列的固定宽度字段。在所有情况下,当我设置固定宽度字段的值时,我都会使用长度等于该字段宽度的字符串。其中一些字符串包含尾随空格。但是,当我从数据库中检索这些值时,尾随空格消失了,并且字符串比应有的短得多。有什么办法可以防止这种行为吗?

最佳答案

结果是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破坏了 Code First 迁移。自 MyModel不再具有公共(public)默认构造函数,Code First Migrations 将实例化 MyContextFactory并称之为 Create()方法,它不调用 ExecuteSqlCommand 。这没关系,因为与实际的应用程序代码不同,迁移可以在不更改 SQL 模式的情况下正常工作。

执行此操作的另一种方法是执行 SQL 语句 SET GLOBAL sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';在数据库设置时,也许可以使用Sql迁移中的方法。我没有这样做,因为它会影响整个数据库服务器,而不仅仅是一个特定的数据库,而且我正在与其他人共享一台 MySQL 服务器,而我不想冒险破坏他们的代码。

关于c# - 不要从 Entity Framework 中的固定宽度列中去除空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34682342/

相关文章:

.net - ADO.NET Entity Framework : Update Wizard will not add tables

c# - 如何从 List<int[]> 中删除 int[]?

c# - 哪种是在 Entity Framework 中调用存储过程的最佳方法

C#/.Net 错误 : MySql. 数据对象引用未设置为对象的实例

c# - 在另一台计算机上运行 C# 程序时出现 System.IO.FileLoadException

c# - 如何使用单独的逗号 (,) 绑定(bind)下拉列表中的两列值

asp.net-mvc - AJAX Get 请求返回成功或错误,具体取决于从 Controller 接收到的对象

MySQL 查询以计算电子邮件地址字段中的唯一域

mysql - 创建mysql日期范围

java - 是否可以连接 mysql 和 sql server 以获取其中的表?