2010-12-21 5 views
2

ASP.NET MVCサイトを作成する際に奇妙な問題が発生します。 SQL Serverデータベースにいくつかの日付範囲を返すビューがあります。ビューは、SSMSでクエリを実行するときに正常に動作します。MVCエンティティフレームワークモデルが正しいデータを返さない

ビューデータがEntity Framework Modelによって返されると、正しい行数が返されますが、一部の行は複製されます。あなたがCからすべての選択した場合、(テーブル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') 

だから今:

SQL Serverのコードを:

EDITEDをここで

は、私がやっていることの一例です4つの異なる日付範囲が得られます

エンティティフレームワークモデル(「コア」と呼んでいます)では、ビュー「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()); 
    } 

} 

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

私はこのすべてを実行すると、それはこの出力:それはこれを行う必要がある場合は

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

を(このビューが返すもの):

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

また、私はその上に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] 

その間にデータに何かをする。

私には、すべてがうまく見えます!私は何かを逃したか?

乾杯、 ベン

EDIT:

申し訳ありませんが、テーブル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

関連する問題