【问题标题】:Sql query in .NET MVC 5.NET MVC 5 中的 Sql 查询
【发布时间】:2015-03-27 23:32:01
【问题描述】:

我正在尝试使用实体框架执行 SQL 查询

        var timetable = db.Services.SqlQuery("SELECT Services.Date, Services.Time, Trains.Name, ServiceTypes.Name FROM Services INNER JOIN Trains ON Services.TrainId = Trains.Id INNER JOIN ServiceTypes ON Services.ServiceType = ServiceTypes.Id").ToList();

在数据库上执行 SQL 时返回数据正常,因此我知道查询有效并返回正确的数据。然而,当执行上面的代码行时,我得到了以下错误。

数据读取器与指定的不兼容 'MyDataModel.Service'。类型“Id”的成员没有 数据阅读器中同名的对应列

以下是我正在访问的数据模型。

服务模式

public partial class Service
{
    public Service()
    {
        this.Tickets = new HashSet<Ticket>();
        this.TrainStops = new HashSet<ServiceStop>();
    }

    public int Id { get; set; }
    public int TrainId { get; set; }
    public Nullable<int> DisabledUserId { get; set; }
    public System.TimeSpan Time { get; set; }
    public System.DateTime Date { get; set; }
    public int ServiceType { get; set; }

    public virtual Train Train { get; set; }
    public virtual ICollection<Ticket> Tickets { get; set; }
    public virtual ServiceType ServiceTypeId { get; set; }
    public virtual ICollection<ServiceStop> TrainStops { get; set; }
    public virtual User User { get; set; }
}

}

火车模型

    public partial class Train
{
    public Train()
    {
        this.Services = new HashSet<Service>();
        this.Tickets = new HashSet<Ticket>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Manufacturer { get; set; }
    public int Year { get; set; }
    public int Seats { get; set; }

    public virtual ICollection<Service> Services { get; set; }
    public virtual ICollection<Ticket> Tickets { get; set; }
}

}

服务类型模型

    public partial class ServiceType
{
    public ServiceType()
    {
        this.Services = new HashSet<Service>();
    }

    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Service> Services { get; set; }
}

}

【问题讨论】:

    标签: c# sql asp.net-mvc entity-framework asp.net-mvc-5


    【解决方案1】:

    您没有从服务表中选择 ID 列。尝试将其添加到 SQL 字符串中。

    【讨论】:

    • 添加时我仍然得到相同的错误,但对于 TrainId 和 DisabledId 但这些是我不需要选择的列。
    【解决方案2】:

    查询结果需要完全映射到Service。因此,修改您的 SELECT 以包含所有 Service 列。

    【讨论】:

    • 感谢它的工作原理,为什么 .net 需要完全映射到它??通常情况下,这不是必需的。?
    • 是你的 ORM 需要它。就您而言,实体框架(我认为)。 DbSet(即您的db.Services)要求结果列映射到您的Service 类的每个属性。如果缺少其中一个,您的 ORM 将引发异常。或者,您可以创建一个单独的类来表示原始查询的结果......例如db.Database.SqlQuery&lt;YourCustomClass&gt;("...")YourCustomClass 类不必是数据库中的表。
    猜你喜欢
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多