Xamarin iOS:值不能为null。参数名称:键

时间:2018-08-22 17:55:16

标签: entity-framework xamarin.forms xamarin.ios .net-standard ef-core-2.1

我有一个xamarin表单解决方案,除了物理iOS设备之外,我都能正常工作。它可以在模拟的iOS,Android和物理Android设备上100%正常运行,但在物理iOS设备上则无法工作。

让我详细说明。该解决方案在物理iOS设备上运行,并进入登录屏幕,然后在其中连接到数据库并登录。此功能适用于除iOS物理设备以外的所有设备。

我得到的错误是:

The type initializer for 'Microsoft.EntityFrameworkCore.SqlServer.Query.ExpressionTranslators.Internal.SqlServerCompositeMethodCallTranslator' threw an exception.

内部异常:

Value cannot be null.
Parameter name: key

这是堆栈跟踪:

  at System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) [0x00008] in <c4da4bcb0a614f31bf9f25261a36b747>:0 
  at System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) [0x00000] in <c4da4bcb0a614f31bf9f25261a36b747>:0 
  at Microsoft.EntityFrameworkCore.SqlServer.Query.ExpressionTranslators.Internal.SqlServerDateAddTranslator..ctor () [0x000c5] in <841b527f2aa54cccaf5150a4cca376c9>:0 
  at Microsoft.EntityFrameworkCore.SqlServer.Query.ExpressionTranslators.Internal.SqlServerCompositeMethodCallTranslator..cctor () [0x00016] in <841b527f2aa54cccaf5150a4cca376c9>:0 

我正在使用Entity Framework Core 2.1.2,而我的数据项目上的目标框架是.NET Standard 2.0

  1. 为什么物理iOS设备与模拟iOS设备不同?

  2. 我该怎么办才能克服此错误?

  3. 无论如何,我是否可以找到它为空的值?

修改

我发现我的问题是我没有连接到数据库。虽然我不知道我的连接出了什么问题。

这种连接到sql服务器的方法有什么问题吗?

(注意:开发人员和主数据库是正确的,因为使用 这些连接字符串)

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder);

            //optionsBuilder.UseSqlServer(
            //    "System.Data.SqlClient",
            //    options => options.EnableRetryOnFailure(1, TimeSpan.FromSeconds(30), null));

            string cn;

            if(Debugger.IsAttached)
            {
                cn = devDB;
            }
            else
            {
                cn = mainDB;
            }

            SqlConnectionStringBuilder cns = new SqlConnectionStringBuilder();

            cns.ConnectionString = cn;

            optionsBuilder.UseSqlServer(cns.ConnectionString, options => options.EnableRetryOnFailure(1, TimeSpan.FromSeconds(60), null));
        }

1 个答案:

答案 0 :(得分:1)

  

为什么物理iOS设备与模拟iOS设备不同?

答案就在您的问题中:)首先-iOS使用模拟器而不是模拟器。 :) 区别在于模拟器不会尝试模拟设备的实际性能(时钟速度,I / O等)。它将分配设备的RAM(就像在iPhone 5S上一样,它将显示512MB的最大RAM,但在iPhone X 2 GB上)。但是,出于其他方面的考虑,它将使用计算机的全部性能(例如CPU或写入/读取速度)。

无论如何,主要的问题是,要在模拟器中运行该应用程序,您需要为x86架构构建所有框架。那个问题。有时人们不构建用于移动或桌面体系结构的库。您很幸运,到目前为止您还没有遇到这个问题:)))构建过程的差异可能会引入无法预测的错误,因此始终必须在设备上进行测试。

  

我该怎么办才能克服此错误?

很难说,因为错误消息是如此普遍。我个人首先要确保设备上存在数据库,并且我的代码至少可以打开与它的连接。

  

无论如何,我是否可以找出它的价值所在?   空吗?

这与插入有关。也许,也许您一直在从数据库中读取数据,直到现在才尝试插入。如果是,则从位于捆绑软件中的数据库中读取数据。您需要将其复制到documents文件夹才能写入。

希望有帮助!