我将 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/