代码之家  ›  专栏  ›  技术社区  ›  craig

EF Core一对多带IQueryable

  •  0
  • craig  · 技术社区  · 7 年前

    我试图在基于表的模型之间创建一对多关系( Driver )以及基于SQL查询的模型( DriverSchedule

    司机

    [Table("Drivers")]
    public class Driver
    {
        [Key]
        [Column("DriverKey")]
        public int ID { get; set; }
        ...
        public virtual ICollection<DriverSchedule> DriverSchedules { get; set; }
    }
    

    型号:

    public class DriverSchedule
    {
        public int DriverID { get; set; }  // foreign key
        public DateTime Date { get; set; }
        public bool IsScheduled { get; set; }
        public virtual Driver Driver { get; set; }
    }
    

    VendorDbContext 上下文:

    public class VendorDbContext : DbContext
    {
        ...
        public DbSet<Driver> Drivers { get; set; }
        ...
    
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<DriverSchedule>().HasKey(table => new { table.DriverID, table.Date });
            modelBuilder.Entity<Driver>().HasMany(d => d.DriverSchedules).WithOne(s => s.Driver);
            ...
            modelBuilder.Query<DriverSchedule>();
        }
    
        public IQueryable<DriverSchedule> DriverSchedules(DateTime startingDate, DateTime endingDate) =>
            Query<DriverSchedule>().FromSql("<SQL>");
    }
    

    视图:

    @model IEnumerable<Driver>
    ...
    @foreach (var item in Model)
    {
        <tr>
            <td>@(item.Name)</td>
            <td>@(item.ID)</td>
            <td><ul>
                foreach (var driverSchedule in item.DriverSchedules)
                {
                    <li>@(driverSchedule.ToString("MM/dd/yy") - @(driverSchedule.IsScheduled)</li>
                }
            </ul></td>
        </tr>
    }
    ...
    

    var model = await (
        from driver in _context.Drivers
        join schedule in _context.DriverSchedules(startDate.Date, endDate.Date) on driver.ID equals schedule.DriverID
        orderby driver.LastName, driver.FirstName
        select driver
    ).Include(x => x.DriverSchedules)
    .ToListAsync();
    

    当我运行代码时,这一行:

    modelBuilder.Query<DriverSchedule>();
    

    生成错误:

    无法将查询类型“DriverSchedule”添加到模型中,因为

    **编辑0**

    这篇文章 https://msdn.microsoft.com/en-us/magazine/mt847184.aspx 暗示我需要

    司机 :

    //public virtual ICollection<DriverSchedule> DriverSchedules { get; set; }
    

    驱动器时间表 :

    //public virtual Driver Driver { get; set; }
    

    从中删除关系定义 OnModelCreating :

    // modelBuilder.Entity<DriverSchedule>().HasKey(table => new { table.DriverID, table.Date });
    // modelBuilder.Entity<Driver>().HasMany(d => d.DriverSchedules).WithOne(s => s.Driver);
    

    IQueryable<DriverSchedule> DriverSchedules(DateTime startingDate, DateTime endingDate) =>
            Query<DriverSchedule>() ...
    

    定义查询和实体之间的关系:

    modelBuilder.Query<DriverSchedule>().HasOne<Driver>().WithMany();
    

    model = await _context.DriverSchedules(startDate.Date, endDate.Date)
               .Include("Driver")
               .ToListAsync();
    

    由于以下错误而失败:

    “驱动程序计划”。“Include(string)”方法只能与 “.”导航属性名称的分隔列表。

    **/编辑0**

    SELECT  m.DriverID, c.Date
            ,CAST( CASE WHEN COUNT(CASE WHEN c.date <> CAST(m.StartTime AS DATE) THEN NULL ELSE m.MovementID end)>0 THEN 1 ELSE 0 END AS BIT) IsScheduled
    FROM    dbo.Calendar c
    CROSS APPLY vMovements m
    WHERE  1 = 1
    AND   c.date BETWEEN {startingDate} AND {endingDate}
    AND   m.DriverID IS NOT NULL
    GROUP BY c.date, m.DriverID
    

    **/编辑1**

    我错过了什么?

    0 回复  |  直到 7 年前
        1
  •  1
  •   RogerEdward    7 年前

    因为你已经有一个实体叫做 驱动器时间表

    modelBuilder.Entity<DriverSchedule>();
    modelBuilder.Query<DriverSchedule>(); // wrong. 
    

    public class Driversched
    {
        public int DriverID { get; set; }  // foreign key
        public DateTime Date { get; set; }
        public bool IsScheduled { get; set; }
        public virtual Driver Driver { get; set; }
    }
    

    然后:

    modelBuilder.Query<Driversched>();
    

    最后:

     public IQueryable<Driversched> DriverSchedules(DateTime startingDate, DateTime endingDate) =>
            Query<DriverSchedule>().FromSql("<SQL>");
    

    推荐文章