2010-12-21 5 views
2

ASP.NET MVC 사이트를 작성하는 동안 이상한 문제가 발생합니다. 내 SQL Server 데이터베이스에서 몇 가지 기간을 반환하는보기가 있습니다. SSMS에서 쿼리를 실행할 때보기가 제대로 작동합니다.MVC 엔터티 프레임 워크 모델에서 올바른 데이터를 반환하지 않습니다.

Entity Framework 모델에서 뷰 데이터를 반환하면 올바른 행 수를 반환하지만 일부 행은 복제됩니다. 여기

내가 한 일의 예입니다

SQL 서버 코드 :

편집 : (테이블 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') 

, 당신은 C에서 모든 선택하는 경우 4 개의 다른 날짜 범위가 있습니다.

Entity Framework Model ('Core')에서 'C'보기가 추가되었습니다. MVC 컨트롤러에서

:

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

     return View(clist.ToList()); 
    } 

} 

가 :

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

는이 작업을 수행해야합니다 (이 :

@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 /> 
    } 
} 

나는이 모든 것을 실행, 그것은이 출력 보기가 반환하는 값) :

또한, 나는 그것을 통해 SQL 프로파일 러를 실행 한 그에 따라 쿼리가 실행되는 것입니다 :

은 그래서 엔티티 프레임 워크 것 같다 올바른 데이터를 반환

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] 

당분간 데이터에 뭔가를하십시오.

내게는 모든 것이 멋지다! 내가 놓친 게 있니?

건배, 벤

편집 :

죄송합니다, 테이블 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] 
+0

아마도이 질문의 MVC 측면을 제거해야합니다. 실제로는 관련이 없습니다. 이것은 SQL/EF 문제인 것으로 보입니다. – RPM1984

+0

RPM에 감사드립니다. 저는 사람들이 상황을 테스트 할 수있는 쉬운 방법을 제공하기를 원했습니다. 어쨌든, 나는 아래에 설명 된대로 내 자신의 문제를 해결했습니다. – Beno

답변

3

나는 그것을 나 자신을 알아 냈다.

문제는 뷰가 엔티티 모델에서 매핑 된 방식과 관련이 있습니다.

추가되면 엔티티 키가 ID가됩니다. 나는 ID와 FromDate에 그것을 필요로했다. 그래서 엔티티 키에 FromDate를 포함 시켰고 정상적으로 작동합니다.

+0

방금 ​​비슷한 상황이었습니다. 내 견해는 SSMS에서 제대로 작동했지만 응용 프로그램이 이상한/중복 된 결과를 가져 왔지만 행 수가 적습니다. 내 EF 키를 확인하고 이상한 랜덤 어소트먼트가 선택되었습니다. 올바른 키를 선택했는데 이제는 제대로 작동합니다. 엄청 이상해. – Gary

관련 문제