MVC Entity Framework Model не возвращает правильные данные - PullRequest
2 голосов
/ 21 декабря 2010

Сталкиваются со странной проблемой при написании сайта ASP.NET MVC.У меня есть представление в моей базе данных SQL Server, которое возвращает несколько диапазонов дат.Представление работает нормально при выполнении запроса в SSMS.

Когда данные представления возвращаются моделью Entity Framework, возвращается правильное количество строк, но некоторые строки дублируются.

Вот пример того, что я сделал:

Код SQL Server:

РЕДАКТИРОВАНИЕ: (таблица 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', '20101231')
INSERT INTO A (ID, PhID, FromDate, ToDate) VALUES (2, NULL, '20100801', '20100901')
INSERT INTO A (ID, PhID, FromDate, ToDate) VALUES (2, 101, '20101201', '20101231')

Итак,если вы выбираете все из C, вы получаете 4 отдельных диапазона дат

В Entity Framework Model (которую я называю «Core») добавляется представление «C».

в 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());
    }

}

в MVC View:

@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]

, который возвращает правильныйdata

Похоже, что в настоящее время платформа сущностей что-то делает с данными.

Для меня все выглядит хорошо!Я что-то пропустил?

Ура, Бен

РЕДАКТИРОВАТЬ:

извините, таблица А должна быть:

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]

1 Ответ

3 голосов
/ 21 декабря 2010

Я сам понял.

Проблема была в способе отображения представления в модели сущности.

Когда он был добавлен, он сделал ключ объекта просто идентификатором. Мне нужно было это поверх идентификатора и FromDate. Поэтому я включил FromDate в ключ сущности, и он работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...