Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF Core-从SQL视图加载的导航属性_C#_Entity Framework_Ef Core 2.2 - Fatal编程技术网

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);
}