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]
vielleicht sollten Sie die MVC Aspekte dieser Frage entfernen - da es nicht wirklich relevant ist. Dies scheint ein SQL/EF-Problem zu sein. – RPM1984
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