我有一个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
为什么物理iOS设备与模拟iOS设备不同?
我该怎么办才能克服此错误?
无论如何,我是否可以找到它为空的值?
修改
我发现我的问题是我没有连接到数据库。虽然我不知道我的连接出了什么问题。
这种连接到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));
}
答案 0 :(得分:1)
为什么物理iOS设备与模拟iOS设备不同?
答案就在您的问题中:)首先-iOS使用模拟器而不是模拟器。 :) 区别在于模拟器不会尝试模拟设备的实际性能(时钟速度,I / O等)。它将分配设备的RAM(就像在iPhone 5S上一样,它将显示512MB的最大RAM,但在iPhone X 2 GB上)。但是,出于其他方面的考虑,它将使用计算机的全部性能(例如CPU或写入/读取速度)。
无论如何,主要的问题是,要在模拟器中运行该应用程序,您需要为x86架构构建所有框架。那个问题。有时人们不构建用于移动或桌面体系结构的库。您很幸运,到目前为止您还没有遇到这个问题:)))构建过程的差异可能会引入无法预测的错误,因此始终必须在设备上进行测试。
我该怎么办才能克服此错误?
很难说,因为错误消息是如此普遍。我个人首先要确保设备上存在数据库,并且我的代码至少可以打开与它的连接。
无论如何,我是否可以找出它的价值所在? 空吗?
这与插入有关。也许,也许您一直在从数据库中读取数据,直到现在才尝试插入。如果是,则从位于捆绑软件中的数据库中读取数据。您需要将其复制到documents文件夹才能写入。
希望有帮助!