2013-07-31 2 views
1

Использование MVC 4 с EF 5x и очень новое для них.Несовместимый считыватель данных

Моих объекты и контексты и т.д. были созданы автоматически в VS 2010 из существующей базы данных, но когда я пытаюсь получить результат через необработанный SQL запрос я получаю сообщение об ошибке:

The data reader is incompatible with the specified 'PlatinumModel.Sales_Journal'. A member of the type, 'Line_No', does not have a corresponding column in the data reader with the same name. 

Пакетообрезчик решения обмена, связанные с эта ошибка (The data reader is incompatible . A member does not...) предположила, что ошибка возникает, когда имеется недостающий столбец или что требуется обновить модель edmx (что я сделал, хотя не было необходимости, поскольку база данных не была изменена)

Sales_Journal. cs - Часть Platinum.tt f Ile

namespace PPoS_MVC_Site.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Sales_Journal 
    { 
     public int Line_No { get; set; } 
     public Nullable<System.DateTime> Date_Time { get; set; } 
     public Nullable<byte> Workstation_No { get; set; } 
     public Nullable<short> User_No { get; set; } 
     public Nullable<int> Trans_No { get; set; } 
     public Nullable<int> Invoice_No { get; set; } 
     public string Account_No { get; set; } 
     public string Product_Code { get; set; } 
     public string Department_No { get; set; } 
     public Nullable<float> Qty { get; set; } 
     public Nullable<float> Pack_Size { get; set; } 
     public Nullable<float> Ave_Cost { get; set; } 
     public Nullable<float> Sales_Tax { get; set; } 
     public Nullable<byte> Tax_Type { get; set; } 
     public Nullable<float> Discount_Amt { get; set; } 
     public Nullable<float> Dicount_Value { get; set; } 
     public Nullable<float> Line_Total { get; set; } 
     public Nullable<float> Function_Key { get; set; } 
     public Nullable<byte> Location { get; set; } 
     public Nullable<bool> Stock_Level { get; set; } 
     public Nullable<int> Branch_No { get; set; } 
     public Nullable<int> Cashup_No { get; set; } 
     public string Extra { get; set; } 
     public Nullable<decimal> Table_No { get; set; } 
     public Nullable<decimal> Tab_No { get; set; } 
     public Nullable<int> Covers { get; set; } 
     public Nullable<int> User_Overide { get; set; } 
     public string Room_No { get; set; } 
     public string Res_No { get; set; } 
     public string Instructions { get; set; } 
     public string Order_no { get; set; } 
     public Nullable<int> Points { get; set; } 
     public string Time_Placed { get; set; } 
     public Nullable<int> JobCard_No { get; set; } 
     public Nullable<int> Quote_No { get; set; } 
     public string Serial_No { get; set; } 
    } 
} 

Sales_Journal SQL код создания

CREATE TABLE [dbo].[Sales_Journal](
    [Line_No] [int] IDENTITY(1,1) NOT NULL, 
[Date_Time] [datetime] NULL, 
[Workstation_No] [tinyint] NULL, 
[User_No] [smallint] NULL, 
[Trans_No] [int] NULL, 
[Invoice_No] [int] NULL, 
[Account_No] [nvarchar](16) NULL, 
[Product_Code] [nvarchar](25) NULL, 
[Department_No] [nvarchar](10) NULL, 
[Qty] [real] NULL, 
[Pack_Size] [real] NULL, 
[Ave_Cost] [real] NULL, 
[Sales_Tax] [real] NULL, 
[Tax_Type] [tinyint] NULL, 
[Discount_Amt] [real] NULL, 
[Dicount_Value] [real] NULL, 
[Line_Total] [real] NULL, 
[Function_Key] [real] NULL, 
[Location] [tinyint] NULL, 
[Stock_Level] [bit] NULL, 
[Branch_No] [int] NULL, 
[Cashup_No] [int] NULL, 
[Extra] [nvarchar](50) NULL, 
[Table_No] [numeric](10, 1) NULL, 
[Tab_No] [numeric](10, 1) NULL, 
[Covers] [int] NULL, 
[User_Overide] [int] NULL, 
[Room_No] [char](10) NULL, 
[Res_No] [char](10) NULL, 
[Instructions] [nvarchar](250) NULL, 
[Order_no] [varchar](40) NULL, 
[Points] [int] NULL, 
[Time_Placed] [varchar](5) NULL, 
[JobCard_No] [int] NULL, 
[Quote_No] [int] NULL, 
[Serial_No] [varchar](25) NULL, 
    CONSTRAINT [PK_Sales_Journal] PRIMARY KEY CLUSTERED 
    (
     [Line_No] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

код контроллера пытается взаимодействовать с этим

public void calculateBasicDayData() { 
    string sSqlCash = "SELECT * FROM Sales_Journal WHERE Function_Key = 9 AND CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, Date_Time))) = '" + this.targetDate.ToString() + "'"; 
    string sSqlCashCount = "SELECT COUNT(Sales_Journal.Line_No) FROM Sales_Journal WHERE Function_Key = 9 AND CONVERT(DATETIME, FLOOR(CONVERT(FLOAT, Date_Time))) = '" + this.targetDate.ToString() + "'"; 
    var sJournalCash = platContext.Sales_Journal.SqlQuery(sSqlCash); 

    this.NumberOfCashSales = platContext.Sales_Journal.SqlQuery(sSqlCashCount).Count(); 
    this.TotalCash = this.calculateDayTotalSales(sJournalCash); 
} 

private decimal calculateDayTotalSales(System.Data.Entity.Infrastructure.DbSqlQuery<Sales_Journal> sj) 
{ 
    decimal cashtotal = 0; 

    foreach (var jItem in sj.ToList()) 
    { 
     cashtotal += decimal.Parse(jItem.Line_Total.ToString()); 
    } 

    return cashtotal; 
} 
+0

Является ли ваш столбец 'Line_No' в базе данных допустимым? – haim770

+0

Привет haim770, его поле IDENTITY для стола, так что нет. –

+0

Как вы можете использовать EF ?? – yusuf

ответ

2

Вы пытаетесь «бросить» счетчик на Sales_Journal объект, который не работает:

platContext.Sales_Journal.SqlQuery(sSqlCashCount).Count() 

Этот SQL запрос возвращает целое число, которое он затем пытается создать Sales_Journal объект из.

Вы пытались использовать LINQ вместо этого? Так что-то вроде:

this.NumberOfCashSales = 
    platContext.Sales_Journal.Count(s => s.Function_Key == 9 && 
             (s.Date_Time != null && 
             s.Date_Time >= this.targetDate.Date && 
             s.Date_Time < this.targetDate.Date.AddDays(1))); 

Это дает вам сильно типизированных запросов без необходимости написания запросов SQL в коде (которые намного сложнее отлаживать!).

+0

Спасибо Torn. Изменен код: this.NumberOfCashSales = sJournalCash.Count(); и это дало мне рекордный показатель. Код verbatum дал ошибку из-за «s.Date_Time.Date», снял «.Date», и он вернул 0, но поставил меня в правильном направлении, чтобы исправить его. Большое спасибо за помощь. –

+0

Да, я полагаю, что свойство '.Date' не будет работать, поскольку это не переводит на правильный SQL. Будет обновлен пример кода, чтобы он проверял, что столбец «Date_Time» находится между датой начала и окончания. –

1

Поскольку Line_No является первичным ключом, вы должны быть в состоянии заменить COUNT(Sales_Journal.Line_No) с COUNT(*), поскольку запрос будет быть оптимизированным в любом случае.

Смежные вопросы