Я получаю ~ 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](https://i.stack.imgur.com/PHaXO.png)
Ниже приведено сообщение об исключении:
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](https://i.stack.imgur.com/TqOnY.png)
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
рассматривается как коллекция, если это ссылка на одно поле.
Редактировать финал:
Я никогда не нашел решение этой проблемы. Я воссоздал все таблицы и тому подобное в другой среде, и все работает отлично. Не очень идеальное решение для уничтожения всех таблиц, классов и миграций, но это единственное, что решило проблему.