C# EF Core-从SQL视图加载的导航属性
我拥有以下实体:C# EF Core-从SQL视图加载的导航属性,c#,entity-framework,ef-core-2.2,C#,Entity Framework,Ef Core 2.2,我拥有以下实体: public class Animal { public int Id { get; set; } public string Name { get; set; } /// <summary> /// Current Animal Status /// </summary> public virtual AnimalStatus Curre
public class Animal
{
public int Id { get; set; }
public string Name { get; set; }
/// <summary>
/// Current Animal Status
/// </summary>
public virtual AnimalStatus CurrentAnimalStatus
{
get { return AnimalStatuses.OrderByDescending(x => x.VersionNo).First(); }
}
/// <summary>
/// List of all Animal Statuses
/// </summary>
public virtual ICollection<AnimalStatus> AnimalStatuses { get; set; }
/// <summary>
/// List of all Animal Operations
/// </summary>
public virtual ICollection<AnimalOperation> AnimalOperations { get; set; }
}
我只对最新的AnimalStatus
感兴趣,因此希望使用一个视图来填充CurrentAnimalStatus
属性,并且不再需要ICollection
。动物
实体的其余部分应由EF核心填充
目前,AnimalStatus
表包含300000条记录,因此使用EF Core和
_dbContext.Animal.Include(x => x.AnimalStatus);
在EF Core中,是否可以从SQL视图填充实体上的导航属性
CREATE VIEW [dbo].[CurrentAnimalStatusView]
AS
WITH ANIMAL_EVENTS_CTE AS
(
SELECT
AnimalId,
BloodCount,
ROW_NUMBER() OVER (PARTITION BY AnimalId ORDER BY VersionNo DESC) AS RowNumber --RowNumber = 1 indicates the latest status
FROM
AnimalBloodTests
)
SELECT
AnimalId,
BloodCount
FROM
ANIMAL_EVENTS_CTE cte
WHERE
RowNumber = 1 --Only interested in latest status for each AnimalId
您可以为视图创建模型并将其映射到Dbset
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<CurrentAnimalStatus>(eb =>
{
eb.HasNoKey();
eb.ToView("CurrentAnimalStatusView");
});
base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity(eb=>
{
eb.HasNoKey();
eb.ToView(“当前动物状态视图”);
});
基于模型创建(modelBuilder);
}
我认为,视图和ORM通常不值得。通常,如果使用ORM,性能不会提高,并且会失去大部分好处。IQueryable查询是什么样子的?因为我在您的视图中没有看到与AnimalStatus的连接,而这正是您的EF查询所做的。另一种方法是在查询动物并仅加载相关属性和最新状态时创建投影。我收到如下错误:无法添加导航“”,因为它以无键实体类型“MyView”为目标。导航只能针对具有键的实体类型。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<CurrentAnimalStatus>(eb =>
{
eb.HasNoKey();
eb.ToView("CurrentAnimalStatusView");
});
base.OnModelCreating(modelBuilder);
}