C# &引用;“未知数据类型”;Firebird embedded和实体框架6出错

C# &引用;“未知数据类型”;Firebird embedded和实体框架6出错,c#,ef-code-first,firebird,entity-framework-6,firebird-embedded,C#,Ef Code First,Firebird,Entity Framework 6,Firebird Embedded,我使用的是一个嵌入式Firebird数据库,代码优先(EntityFramework 6)。应用程序第一次运行时,工作正常:创建数据库并插入数据。但每次运行之后,它都会抛出以下异常: 中发生“System.NotSupportedException”类型的异常 FirebirdSql.Data.FirebirdClient.dll,但未在用户代码中处理 其他信息:未知数据类型 该项目包括以下NuGet软件包: EntityFramework[6.0.2] Firebird ADO.NET数据提

我使用的是一个嵌入式Firebird数据库,代码优先(EntityFramework 6)。应用程序第一次运行时,工作正常:创建数据库并插入数据。但每次运行之后,它都会抛出以下异常:

中发生“System.NotSupportedException”类型的异常 FirebirdSql.Data.FirebirdClient.dll,但未在用户代码中处理

其他信息:未知数据类型

该项目包括以下NuGet软件包:

  • EntityFramework[6.0.2]
  • Firebird ADO.NET数据提供程序(实体框架6)[4.1.0.0]
我将
dbProviderFactorys
FirebirdSql.Data.FirebirdClient
提供程序添加到
App.config
,如前所述

我还将Firebird DLL添加到项目中,并将其设置为复制到输出目录:

  • fbembed.dll
  • ib_util.dll
  • icudt30.dll
  • icuin30.dll
  • icuuc30.dll
没有代码优先迁移(尽管由于某种原因仍然会创建
\u MigrationHistory
表)

代码如下:

类程序
{
静态void Main(字符串[]参数)
{
SetInitializer(新的CreateDatabaseIfNotExists());
string connectionString=“服务器类型=嵌入式;用户id=sysdba;密码=主密钥;角色名称=RDB$ADMIN;字符集=UTF8;初始目录=test.fdb”;
使用(var context=newfirebirddbcontext(connectionString))
{
context.Users.Add(新用户()
{Created=DateTime。现在,
Name=“smith”});
SaveChanges();
}
}
}
类用户
{
[关键]
已创建公共日期时间{get;set;}
公共字符串名称{get;set;}
}
类FirebirdDbContext:DbContext
{
公共FireBirdBContext(字符串connString)
:base(新FbConnection(connString),true){}
公共数据库集用户{get;set;}
}
类MyConfiguration:DbConfiguration
{
公共MyConfiguration()
{
SetDefaultHistoryContext((c,s)=>newSmallKeyHistoryContext(c,s));
}
}
类SmallKeyHistoryContext:HistoryContext
{
public SmallKeyHistoryContext(DbConnection existingConnection,string defaultSchema)
:base(existingConnection,defaultSchema){}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
基于模型创建(modelBuilder);
//HACK:缩小此列以避免以下错误:
//密钥大小超过索引“PK___迁移历史”的实现限制
modelBuilder.Entity().Property(h=>h.ContextKey).HasMaxLength(53.IsRequired();
}
}
context.Users.Add(…)
行中引发异常

下面是堆栈跟踪:

at FirebirdSql.Data.Common.DbValue.GetBytes() in c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\Common\DbValue.cs:line 315
at FirebirdSql.Data.Client.Common.XsqldaMarshaler.MarshalManagedToNative(Charset charset, Descriptor descriptor) in c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\Client\Common\XsqldaMarshaler.cs:line 121
at FirebirdSql.Data.Client.Native.FesStatement.Execute() in c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\Client\Native\FesStatement.cs:line 355
at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteCommand(CommandBehavior behavior, Boolean returnsSet) in c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\FirebirdClient\FbCommand.cs:line 1246
at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteReader(CommandBehavior behavior) in c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\FirebirdClient\FbCommand.cs:line 566
at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteDbDataReader(CommandBehavior behavior) in c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\FirebirdClient\FbCommand.cs:line 666
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<>c__DisplayClassb.<Reader>b__8()
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TInterceptionContext,TResult](Func`1 operation, TInterceptionContext interceptionContext, Action`1 executing, Action`1 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\Common\DbValue.GetBytes()中的FirebirdSql.Data.Common.DbValue.GetBytes()处的
:第315行
在c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\Client\Common\XsqldaMarshaler.MarshalManagedToNative(字符集字符集,描述符描述符)中的FirebirdSql.Data.Client.XsqldaMarshaler.marshaller(字符集字符集,描述符描述符):第121行
在c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\Client\Native\FesStatement.cs中的FirebirdSql.Data.Client.Native.FesStatement.Execute()处:第355行
在c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\FirebirdClient\FbCommand.ExecuteCommand(CommandBehavior行为,布尔返回集)中的FirebirdSql.Data.FirebirdClient.FbCommand.cs:第1246行
在c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\FirebirdClient\FbCommand.ExecuteReader(CommandBehavior行为)中的FirebirdSql.Data.FirebirdClient.FbCommand.cs:第566行
在c:\Users\Jiri\Documents\devel\NETProvider\working\NETProvider\source\FirebirdSql\Data\FirebirdClient\FbCommand.ExecuteDbDataReader(CommandBehavior行为)中的FirebirdSql.Data.ExecuteDbDataReader(CommandBehavior行为):第666行
位于System.Data.Common.DbCommand.ExecuteReader(CommandBehavior)
在System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.c__DisplayClassb.b__8()中
在System.Data.Entity.Infrastructure.InternalDispatcher`1.Dispatch[TInterceptionContext,TResult](Func`1操作,TInterceptionContext拦截上下文,操作`1正在执行,操作`1已执行)
位于System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand命令,DbCommandInterceptionContext interceptionContext)
位于System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior)
位于System.Data.Common.DbCommand.ExecuteReader(CommandBehavior)
位于System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStorommands(EntityCommand EntityCommand,CommandBehavior)
堆栈跟踪指向Firebird库()。我尝试向后跟踪代码,但我无法判断是为所有字段调用了
GetBytes()
,还是只调用了
byte[]
字段。(我最初认为它可能与数据库中的
\uu MigrationHistory.Model
字段有关,但如果该表为空,则仍然会发生错误。但是,我不希望我的推测造成误导。)


我可以绕过这个问题,但我真的很想理解它。有人知道这里发生了什么吗?

我也有同样的问题,实体初始值设定项中嵌入了Firebird:

Database.SetInitializer<FirebirdDbContext>(new CreateDatabaseIfNotExists<FirebirdDbContext>()); 
Database.SetInitializer(新的CreateDatabaseIfNotExists());
如果出现问题,请将其更改为:

Database.SetInitializer<FirebirdDbContext>(null);
Database.SetInitializer(null);
但它不会为您创建数据库。您可以检查数据库文件是否存在,然后更改取消初始值设定项

或者您可以创建您的ini
public class MyCreateDatabaseIfNotExists : IDatabaseInitializer<FirebirdDbContext>
{
    public void InitializeDatabase(FirebirdDbContext context)
    {
        if (!context.Database.Exists())
        {
            context.Database.Create();
        }
    }
}