Firebird嵌入式和实体框架沟特殊字符

Mon*_*nky 5 .net c# firebird entity-framework

介绍

嗨,大家好!我是新来的,我希望我这样做"问"-Thingy吧.;)发现了一个非常令人困惑的问题,我希望有人可以帮助我.

概观

我对EntityFramework.Firebird-Provider有一个非常具体的问题.

当我尝试使用EntityFramework更新实体的属性时,特殊字符(如ö,ü,ä和ß)将转换为点.但是,这只有在我使用Firebird的EmbeddedServer功能时才会发生.

重现步骤

使用一个表创建一个简单的Firebird-Database.这是我的测试表的DDL:

CREATE TABLE CUSTOMER 
(
  ID                  INTEGER      NOT NULL,
  NAME1               VARCHAR(50)  COLLATE ISO8859_1,
  NAME2               VARCHAR(50)  COLLATE ISO8859_1,
  STREET              VARCHAR(50)  COLLATE ISO8859_1,
 CONSTRAINT PK_CUSTOMER PRIMARY KEY (ID)
);
Run Code Online (Sandbox Code Playgroud)

创建一个小的C#Test-Project并添加NuGet-Packages

  • FirebirdSql.Data.FirebirdClient
  • EntityFramework.Firebird

之后你必须更新EntityFramework!我为此使用了版本6.1.3.

添加一个简单的Entity,TypeConfiguration和DbContext,如下所示:

public class SimpleCustomer
{
    public int Id { get; set; }
    public string Name1 { get; set; }
    public string Name2 { get; set; }
    public string Street { get; set; }
}

public class SimpleCustomerTypeConfiguration : EntityTypeConfiguration<SimpleCustomer>
{
    public SimpleCustomerTypeConfiguration()
    {
        this.ToTable("CUSTOMER");

        this.HasKey(e => e.Id);
        this.Property(e => e.Id).HasColumnName("ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
        this.Property(e => e.Name1).HasColumnName("NAME1");
        this.Property(e => e.Name2).HasColumnName("NAME2");
        this.Property(e => e.Street).HasColumnName("STREET");
    }
}

public class FbContext : DbContext
{
    public DbSet<SimpleCustomer> SimpleCustomers { get; set; }

    public FbContext(DbConnection connection) : base(connection, false)
    {
        Database.SetInitializer(new NullDatabaseInitializer<FbContext>());
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new SimpleCustomerTypeConfiguration());

        base.OnModelCreating(modelBuilder);
    }
}
Run Code Online (Sandbox Code Playgroud)

当您现在尝试使用DbContext更新Street等属性时,例如:

using (var connection = new FbConnection(@"User=SYSDBA; Password=masterkey; Database=TEST.FDB; CharSet=ISO8859_1; ServerType=1; Pooling=false;"))
{
    connection.Open();

    using (var context = new FbContext(connection))
    {
        var writeCustomer = context.SimpleCustomers.Find(1);
        writeCustomer.Street = @"Schloßallee 34";
        context.SaveChanges();
    }
}
Run Code Online (Sandbox Code Playgroud)

街道在数据库中被保存为Schlo.allee 34.

附加信息

以下是我设法弄清楚的一些其他信息:

  • 只有在使用嵌入式Firebird服务器时才会发生这种情况.(ServerType = 1)
  • 更改CharSet或将编码转换为其他类似Unicode或Windows1252的东西似乎没有改变.
    • 除了将Connection-CharSet更改为UTF8时:然后得到两个点而不是一个.Yaaay!\ O /
  • 当您使用经典SQL Update-Command时,更新工作完全正常,例如:

    using (var connection = new FbConnection(@"User=SYSDBA; Password=masterkey; Database=TEST.FDB; CharSet=ISO8859_1; ServerType=1; Pooling=false;"))
    {
        connection.Open();
    
        var command = connection.CreateCommand();
        command.CommandText = @"UPDATE CUSTOMER SET STREET = @STREET WHERE ID = @ID";
        command.Parameters.Add(new FbParameter("STREET", FbDbType.VarChar, 50) { Value = "Schloßallee 34" });
        command.Parameters.Add(new FbParameter("ID", FbDbType.Integer) { Value = 1 });
    
        command.ExecuteNonQuery();
    }
    
    Run Code Online (Sandbox Code Playgroud)