Исключение System.Linq.Expressions, возникающее при использовании FirstOrDefault в .Net Core 2.1 - PullRequest
0 голосов
/ 28 августа 2018

Я получаю ~ 300 + исключений, которые являются спамом в выводе моего сервера, с пометкой:

Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll

Я использую следующий запрос:

Account account = _accountContext.Account.
     Include(i => i.Currency).
     Include(i => i.Unlocks).
     Include(i => i.Settings).
     Include(i => i.Friends).
     FirstOrDefault(a => a.FacebookUserID == facebookUserID);

В конце концов исключения генерируются, в окне вывода отображается большой запрос, и все продолжается как обычно.

Если я изменю запрос на следующий, я не получу исключение:

IQueryable<Account> account = _accountContext.Account.
     Include(i => i.Currency).
     Include(i => i.Unlocks).
     Include(i => i.Settings).
     Include(i => i.Friends).
     Where(a => a.FacebookUserID == facebookUserID);

Однако, если я вызову что-либо, например, First, FirstOrDefault, Single и т. Д. Для переменной IQueryable<Account>, исключения снова запустятся, а затем прекратятся через ~ 300.

Эти исключения приводят к остановке пользовательских логинов более чем на 30 секунд и более. Продолжительность исключений увеличивается с увеличением объема данных, возвращаемых из базы данных.

Я использую объект Account, передавая его вокруг сервера для выполнения различных задач обслуживания, и затем в конечном итоге отправляю объект клиентской части, где он у меня десериализован, в версию клиента класса Account.

Кто-нибудь знает, что может быть причиной этих внутренних исключений и как я могу их устранить или смягчить?

Вот мой выходной журнал: enter image description here

Ниже приведено сообщение об исключении: AccountStatistics не указан в запросе выше, потому что есть около 20 включений, и для краткости я сократил список включений.

Field 'Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor+TransparentIdentifier`2[Project.Models.Account,System.Collections.Generic.IEnumerable`1[Project.Models.AccountStatistics]].Inner' is not defined for type 'Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor+TransparentIdentifier`2[Project.Models.Account,Project.Models.AccountStatistics]'

Нет внутреннего исключения. Я дважды проверил свою базу данных, и у меня есть запись для пользователя, и все его поля заполнены действительными данными.

Класс учетной записи (отредактировано для краткости)

public class Account
    {
        [Key]
        public int ID { get; set; }
        public DateTime CreationDate { get; set; }

        public AccountCurrency Currency { get; set; }
        public AccountProgression Progression { get; set; }
        public AccountSettings Settings { get; set; }
        public AccountStatistics Statistics { get; set; }

        public ICollection<AccountFriendEntry> Friends { get; set; }
        public ICollection<AccountUnlockedGameEntry> Unlocks{ get; set; }
    }

Класс учетной записи

public class AccountStatistics
{
    [Key]
    public int AccountID { get; set; }
    public int LoginCount { get; set; }
    public DateTime LastLoginTime { get; set; }
    public DateTime LastActivityTime { get; set; }
}

Редактировать

Ключи для таблицы статистики аккаунта

enter image description here

   migrationBuilder.CreateTable(
            name: "AccountStatistics",
            columns: table => new
            {
                AccountID = table.Column<int>(nullable: false),
                LoginCount = table.Column<int>(nullable: false),
                LastLoginTime = table.Column<DateTime>(nullable: false),
                CreationDate = table.Column<DateTime>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_AccountStatistics", x => x.AccountID);
                table.ForeignKey(
                    name: "FK_AccountStatistics_Accounts_AccountID",
                    column: x => x.AccountID,
                    principalTable: "Accounts",
                    principalColumn: "ID",
                    onDelete: ReferentialAction.Cascade);
            });

Редактировать 9001

После некоторого тестирования я понял, что исключение возникает только при включении в цепочку.

Это вызовет исключение:

Account account = _accountContext.Account.
     Include(i => i.Currency).
     Include(i => i.Unlocks).
     Include(i => i.Settings).
     Include(i => i.Friends).
     FirstOrDefault(a => a.FacebookUserID == facebookUserID);

Это НЕ приведет к исключению:

Account account = _accountContext.Account.
     Include(i => i.Currency).
     FirstOrDefault(a => a.FacebookUserID == facebookUserID);

Не имеет значения, его валюта и разблокировка, друзья и валюта, настройки и статистика. Любая комбинация включает (2 или более) вызывает исключение.

Редактировать 9002

Вот мои результаты следующего запроса:

var acct = _accountContext.Account
     .Where(a => a.FacebookUserID == facebookUserID)
     .Select(x => new { Account = x, x.Currency, x.Settings }).ToList();

Исключение:

System.ArgumentException: 'Field 'Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor+TransparentIdentifier`2[Project.Models.Account,System.Collections.Generic.IEnumerable`1[Project.Models.AccountSettings]].Inner' is not defined for type 'Microsoft.EntityFrameworkCore.Query.EntityQueryModelVisitor+TransparentIdentifier`2[Project.Models.Account,Project.Models.AccountSettings]''

Мне кажется, что AccountSettings рассматривается как коллекция, если это ссылка на одно поле.

Редактировать финал: Я никогда не нашел решение этой проблемы. Я воссоздал все таблицы и тому подобное в другой среде, и все работает отлично. Не очень идеальное решение для уничтожения всех таблиц, классов и миграций, но это единственное, что решило проблему.

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

У меня такая же проблема. Это ошибка, связанная с отладкой (см. https://github.com/aspnet/EntityFrameworkCore/issues/12548) и будет исправлена ​​только в версии 3.0.

0 голосов
/ 01 ноября 2018

Я получал эту проблему при отладке, а мои коллеги - нет. После сильных царапин на голове мы обнаружили, что я единственный, у которого опция Debugging> General> Enable Just My Code снята.

Отметив это, скрыв тысячи ошибок Exception thrown: 'System.ArgumentException' in System.Linq.Expressions.dll в окне «Вывод», код вернулся к нормальной скорости, и я мог бы счастливо жить, уткнувшись головой в песок.

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