Как сопоставить Sql-запрос с EF-моделями при использовании FromSql - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь использовать .FromSql, но продолжаю получать исключение

"Required Column Id is Missing"

Теперь у всех моих моделей есть идентификатор, поэтому я не знаю, какой из них мне не хватает, или пишу свой "As" утверждения неверны, и они не отображаются должным образом.

            var inventoryItems = dbContext.InventoryItems.AsNoTracking().FromSql(@"SELECT Brands.Id AS BrandsId, InventoryItems.Id AS InventoryItemsId, 
              Companies.Id AS CompaniesIds, Countries.Id AS CountriesId, States.Id AS StatesId, Branches.Id AS BranchesId,
                           Branches.CountryId, Branches.StateId, States.CountryId AS StatesCountryId, InventoryItems.InventoryCategoryId, InventoryItems.BrandId, InventoryItems.BranchId, Branches.CompanyId
FROM            Branches INNER JOIN
                         Brands ON Branches.Id = Brands.Id INNER JOIN
                         Companies ON Branches.CompanyId = Companies.Id INNER JOIN
                         Countries ON Branches.CountryId = Countries.Id INNER JOIN
                         InventoryItems ON Branches.Id = InventoryItems.BranchId AND Brands.Id = InventoryItems.BrandId INNER JOIN
                         States ON Branches.StateId = States.Id AND Countries.Id = States.CountryId ).ToList();

Пример модели и все мои модели следуют одному и тому же шаблону

 public class InventoryItem
{
    public int Id { get; set; } //PK name


    public int InventoryCategoryId { get; set; } // FK name pattern

    public int BranchId { get; set; }
    public virtual Branch Branch { get; set; }

    public int BrandId { get; set; }
    public virtual Brand Brand { get; set; }
}

Я использую FromSql, потому что мне нужно сделать предложение where(не показано), что фильтры в столбце json с ядром EF не поддерживают.

1 Ответ

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

. Запрос .FromSql возвращает один тип сущности.Этот запрос должен возвращать Id, InventoryCategoryId, BranchId, BrandId, один столбец для каждого свойства элемента инвентаря (за исключением свойств навигации).

Если вы хотите загрузить несколько разных типов объектов, вы не можете использовать один вызов .FromSql (),Вместо этого используйте один из методов, подробно описанных здесь .Особое примечание:

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

Таким образом, вы можете выбрать сущности, которые вынужно по нескольким отдельным запросам, если хотите.Но это «исправление» не происходит, если вы подавляете отслеживание изменений в своих сущностях, так как это делает отслеживание изменений.

...