DbContext.EnsureCreated (): ArgumentNullException только при сборке RELEASE - PullRequest
0 голосов
/ 18 апреля 2020

Я использую базу данных Microsoft ef-core и Sqlite в своем приложении xamarin-forms. Моя модель довольно большая, поэтому, думаю, не стоит бросать ее здесь. Я работал над приложением пару недель и проверил свой телефон в режиме Отладка - все работало отлично.

Но как только я собрал версию RELEASE - Я получил ArgumentNullException прямо на DbContext.EnsureCreated() вызове. Я мог бы найти его, используя консольный вывод. Поэтому он говорит:

Value cannot be null. Parameter name: key

При DEBUG сборка моего приложения работает отлично, и в моем коде также нет директив прекомпилятора, зависящих от сборки. Использование Visual Studio 2017

Есть какие-нибудь мысли или советы, что можно проверить?

UPD: вот трассировка стека, которую я получил в версии:

I/mono-stdout(24851): TRACE:  at System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) [0x00008] in <d029cac6f9824b0bb72d5eb6d48d11f3>:0
I/mono-stdout(24851):   at System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) [0x00000] in <d029cac6f9824b0bb72d5eb6d48d11f3>:0
I/mono-stdout(24851):   at Microsoft.EntityFrameworkCore.Sqlite.Query.Internal.SqliteDateTimeAddTranslator..ctor (Microsoft.EntityFrameworkCore.Query.ISqlExpressionFactory sqlExpressionFactory) [0x000c5] in <7b7aa88a95d54aa786bada86edd4821a>:0
I/mono-stdout(24851):   at Microsoft.EntityFrameworkCore.Sqlite.Query.Internal.SqliteMethodCallTranslatorProvider..ctor (Microsoft.EntityFrameworkCore.Query.RelationalMethodCallTranslatorProviderDependencies dependencies) [0x0001d] in <7b7aa88a95d54aa786bada86edd4821a>:0
I/mono-stdout(24851):   at (wrapper managed-to-native) System.Reflection.MonoCMethod.InternalInvoke(System.Reflection.MonoCMethod,object,object[],System.Exception&)
I/mono-stdout(24851):   at System.Reflection.MonoCMethod.InternalInvoke (System.Object obj, System.Object[] parameters, System.Boolean wrapExceptions) [0x00005] in <d029cac6f9824b0bb72d5eb6d48d11f3>:0

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Причина этого заключается в том, что компоновщик чрезмерно агрессивен и удаляет System.DateTime класс из mscorlib сборки. Правильное исправление вместо preserveDateTimeMethods решения, которое вы упомянули, для создания пользовательской конфигурации компоновщика .

  1. Создание пустого файла LinkDescription. xml
  2. Добавьте его в проект уровня ОС (Android, iOS и т. Д. c).
  3. Установите для его действия по сборке значение LinkDescription
  4. Добавить System.DateTime в блок компоновщика

Вот как:

<linker>
  <assembly fullname="mscorlib">
    <type fullname="System.DateTime" preserve="methods" />
  </assembly>
</linker>

PS Не забудьте добавьте <?xml version="1.0" encoding="UTF-8" ?> вверху файла xml.

0 голосов
/ 18 апреля 2020

Итак, я искал часы и как только отправил запрос.

Похоже, это ошибка ef-core - проблема компоновщика при работе с типами DateTime, приводящая к попытке добавления нуля значение ключа в словаре. Ссылки на обсуждение ошибок:

https://github.com/dotnet/efcore/issues/14091

https://github.com/dotnet/efcore/issues/10963

У меня была эта проблема на моем Android Выпуск сборки, поэтому я добавил строку кода из одного из комментариев к первому обсуждению.

Добавил эту строку в мой MainActivity.cs до инициализации Xamarin.Forms:

 var preserveDateTimeMethods = DateTime.Now.AddYears(1).AddMonths(1).AddDays(1).AddHours(1).AddMinutes(1).AddSeconds(1);

Исправлено моя проблема. Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...