2010-12-21 13 views
2

Beim Schreiben einer ASP.NET MVC-Site ist ein seltsames Problem aufgetreten. Ich habe eine Sicht in meiner SQL Server-Datenbank, die einige Datumsbereiche zurückgibt. Die Ansicht funktioniert einwandfrei, wenn die Abfrage in SSMS ausgeführt wird.MVC Entity Framework Modell gibt keine korrekten Daten zurück

Wenn die Ansichtsdaten vom Entity Framework-Modell zurückgegeben werden, wird die korrekte Anzahl von Zeilen zurückgegeben, einige der Zeilen werden jedoch dupliziert. Hier

ist ein Beispiel dafür, was ich getan habe:

SQL Server Code:

EDITED: (Tabelle A)

CREATE TABLE [dbo].[A](
    [ID] [int] NOT NULL, 
    [PhID] [int] NULL, 
    [FromDate] [datetime] NOT NULL, 
    [ToDate] [datetime] NULL, 
CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED 
( [ID] ASC, 
    [FromDate] ASC 
)) ON [PRIMARY] 

CREATE TABLE [dbo].[B](
    [PhID] [int] NOT NULL, 
    [FromDate] [datetime] NULL, 
    [ToDate] [datetime] NULL, 
CONSTRAINT [PK_B] PRIMARY KEY CLUSTERED 
( [PhID] ASC)) ON [PRIMARY] 
go 

CREATE VIEW C as 
SELECT A.ID, 
     CASE WHEN A.PhID IS NULL THEN A.FromDate ELSE B.FromDate END AS FromDate, 
     CASE WHEN A.PhID IS NULL THEN A.ToDate ELSE B.ToDate END AS ToDate 
FROM A 
LEFT OUTER JOIN B ON A.PhID = B.PhID 
go 

INSERT INTO B (PhID, FromDate, ToDate) VALUES (100, '20100615', '20100715') 
INSERT INTO A (ID, PhID, FromDate, ToDate) VALUES (1, NULL, '20100101', '20100201') 
INSERT INTO A (ID, PhID, FromDate, ToDate) VALUES (1, 100, '20100615', '20100715') 

INSERT INTO B (PhID, FromDate, ToDate) VALUES (101, '20101201', '201') 
INSERT INTO A (ID, PhID, FromDate, ToDate) VALUES (2, NULL, '20100801', '20100901') 
INSERT INTO A (ID, PhID, FromDate, ToDate) VALUES (2, 101, '20101201', '201') 

So, jetzt, wenn Sie alle aus dem Verzeichnis C , erhalten Sie 4 separate Datumsbereiche

Im Entity Framework-Modell (das ich 'Core' nennen), wird die Ansicht 'C' hinzugefügt.

in MVC Controller:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     CoreEntities db = new CoreEntities(); 
     var clist = from c in db.C 
        select c; 

     return View(clist.ToList()); 
    } 

} 

in MVC-Ansicht:

@model List<RM.Models.C> 

@{ 
    foreach (RM.Models.C c in Model) 
    { 
     @String.Format("{0:dd-MMM-yyyy}", c.FromDate) 
     <span>-</span> 
     @String.Format("{0:dd-MMM-yyyy}", c.ToDate) 
     <br /> 
    } 
} 

Wenn ich das alles laufen, gibt er dies:

01-Jan-2010 - 01-Feb-2010 
01-Jan-2010 - 01-Feb-2010 
01-Aug-2010 - 01-Sep-2010 
01-Aug-2010 - 01-Sep-2010 

Wenn es das tun sollte (dies ist, was die Ansicht zurückgibt):

01-Jan-2010 - 01-Feb-2010 
15-Jun-2010 - 15-Jul-2010 
01-Aug-2010 - 01-Sep-2010 
01-Dec-2010 - 31-Dec-2010 

Außerdem habe ich die SQL Profiler über sie laufen und nach, dass die Abfrage ausgeführt wird, ist:

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[FromDate] AS [FromDate], 
[Extent1].[ToDate] AS [ToDate] 
FROM (SELECT 
     [C].[ID] AS [ID], 
     [C].[FromDate] AS [FromDate], 
     [C].[ToDate] AS [ToDate] 
     FROM [dbo].[C] AS [C]) AS [Extent1] 

Welche die richtigen Daten zurückgibt

So scheint es, dass die Rahmeneinheit ist in der Zwischenzeit etwas an den Daten tun.

Für mich sieht alles gut aus! Habe ich etwas verpasst?

Cheers, Ben

EDIT:

sorry, sollte Tabelle A sein:

CREATE TABLE [dbo].[A](
    [ID] [int] NOT NULL, 
    [PhID] [int] NULL, 
    [FromDate] [datetime] NOT NULL, 
    [ToDate] [datetime] NULL, 
CONSTRAINT [PK_A] PRIMARY KEY CLUSTERED 
( [ID] ASC, 
    [FromDate] ASC 
)) ON [PRIMARY] 
+0

vielleicht sollten Sie die MVC Aspekte dieser Frage entfernen - da es nicht wirklich relevant ist. Dies scheint ein SQL/EF-Problem zu sein. – RPM1984

+0

Dank RPM, wollte ich nur einen einfachen Weg für die Menschen bieten, die Situation zu testen. Auf jeden Fall habe ich mein Problem wie unten beschrieben gelöst. – Beno

Antwort

3

ich es selbst herausgefunden.

Das Problem war mit der Art, wie die Ansicht im Entitätsmodell zugeordnet wurde.

Wenn es hinzugefügt wurde, machte es den Entity-Schlüssel nur die ID. Ich brauchte es über die ID und FromDate. Also habe ich das FromDate in den Entitätsschlüssel eingefügt und es funktioniert gut.

+0

Ich hatte gerade eine sehr ähnliche Situation. Meine Ansicht funktionierte gut in SSMS, aber meine Anwendung brachte seltsame/doppelte Ergebnisse zurück, hatte aber die korrekte Anzahl von Zeilen. Überprüft meine EF-Tasten und einige seltsame zufällige Auswahl ausgewählt worden war. Ich habe die richtigen Tasten ausgewählt und es funktioniert jetzt gut. Sehr merkwürdig. – Gary