Я получаю исключения ~ 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.
Кто-нибудь знает, что может быть причиной этих внутренних исключений и как я могу их устранить или смягчить?
Ниже приведено сообщение об исключении:
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; }
}
Edit
Ключи для таблицы статистики аккаунта
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);
Неважно, если его валюта и разблокировка, друзья и валюта, настройки и статистика. Любая комбинация include (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
как коллекцию, когда используется ссылка на одно поле.
Редактировать финал: Я никогда не нашел решение этой проблемы. Я воссоздал все таблицы и тому подобное в другой среде, и все работает отлично. Не очень идеальное решение для уничтожения всех таблиц, классов и миграций, но это единственное, что решило проблему.