我正在尝试使用.FromSql,但我不断收到异常
"Required Column Id is Missing"
现在我所有的模型都有ID,所以我不知道我缺少哪个模型,或者如果我写错了"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是因为我需要执行一个不支持对带有EF核心的json列进行过滤的where子句(未显示)。
答案 0 :(得分:0)
.FromSql查询返回单个实体类型。该查询应针对库存商品的每个属性(导航属性除外)返回Id, InventoryCategoryId, BranchId, BrandId,
的一列。
如果要加载多种不同的实体类型,则不能使用单个.FromSql()调用。而是使用详细的here方法之一。特别注意:
Entity Framework Core将自动修复导航属性 到先前已加载到上下文中的任何其他实体 实例。因此,即使您没有明确包括 导航属性,如果某些或 所有相关实体都是先前加载的。
因此,您可以根据需要在多个单独的查询中获取所需的实体。但是,如果您禁止对实体进行更改跟踪,则不会发生这种“修复”,因为更改跟踪器会执行此操作。