【问题标题】:using include on DbSet<TEntity> ef core在 DbSet<TEntity> ef 核心上使用包含
【发布时间】:2020-12-22 18:34:02
【问题描述】:

我有几个类都具有 File 类型的 IEnumerable。但我正在努力将包含与 DbSet 一起使用

 public class FileRepository<T> : IFileRepository<T> where T : class
    {
        private readonly DataContext context;
        private readonly DbSet<T> table = null;

        public FileRepository(DataContext ctx)
        {
            context = ctx;
            table = context.Set<T>();
        }

        public async Task<object> GetByIdAsync(long id)
        {
            if (id > 0)
            {
                return (await table
                  .Include(x => x.Files)
                  .FirstAsync(x => x.Id == id)
                  .ConfigureAwait(false))
                  .Files.ToList();
            }
            else
            {
                return new List<File>();
            }
        }

         
    }

严重性代码描述项目文件行抑制状态 错误 CS1061 'T' 不包含 'Files' 的定义并且没有 可访问的扩展方法“文件”接受类型的第一个参数 可以找到“T”(您是否缺少 using 指令或程序集 参考?)

【问题讨论】:

    标签: c# generics .net-core entity-framework-core


    【解决方案1】:

    编辑 您尝试为特定服务编写代码是通用的。您需要在 T 上添加约束。

    例如 T 是通用的,因此无法知道是否存在属性。 Id 或 Files 在那里,将您的逻辑写在一个层中。

    public class EmployeeFiles<Employee> : IFileRepository<Employee>
    {
        //... Write your logic here instead so the logic is specific to the Entity.
    }
    

    或者你可以让你想要实现文件api的所有实体实现一个接口

     public interface IHasFileProperties
     {
          public int Id {get; set;}
          public ICollection<File> Files { get; set; }
     }
    

    并拥有文件回购:

      IFileRepository<T> where T : IHasFileProperties
    

    此外,从您提出的问题来看,GetById 应该返回 T 而不是文件列表,如果您想获取文件列表,您应该在现有 repo 上进行扩展。

    旁注: ASP.Net-core 摆脱了旧版同步上下文,因此您无需再调用 .ConfigureAwait(false)),除非您使用的是针对旧版 .net 的库4.5 或带有 UI 的应用程序,请参阅此 blog by Stephen Cleary 以获取完整详细信息,有关简要概述,请阅读 @IvanStoev 留下的 cmets

    【讨论】:

    • 这些似乎都不起作用尝试了几种不同的排列,所有这些都导致某种 T 不包含任何东西的定义
    • 抱歉,我现在看到了您的问题。给我一秒钟的时间编辑
    • 为了过分简化我的回答,您正在尝试在通用存储库中编写特定代码,您应该只使用您需要的存储库,然后从 T 获取文件列表。跨度>
    • 所以它只是我想的 ASP.NET Core。请注意,他写道“任何知道它在 ASP.NET Core 下运行的代码都不需要显式避免其上下文。”。还有 “但是,我仍然建议您在核心库中使用它 - 任何可以在其他应用程序中重用的东西。如果您的库中的代码也可以在 UI 应用程序或旧版 ASP.NET 中运行应用程序或其他任何可能存在上下文的地方,那么您仍应在该库中使用 ConfigureAwait(false)。” 无论如何,感谢您的澄清,我很好奇我是否错过了一般的 .NET 内容: -) 干杯。
    • @johnny5 控制台、WinForms (! :-))、WPF、UWP、Xamarin (? - 不确定) - 还有许多非 ASP.NET Core 类型的应用程序。据我了解,自定义同步上下文概念仍然存在,并且 async/await 仍在实现的地方使用它。如果没有自定义实现(如在 ASP.NET Core 中),则默认使用线程池进行恢复,这与 .ConfigureAwait(false) 强制的行为相同。
    猜你喜欢
    • 2019-06-10
    • 2011-11-17
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多