LINQ To SQL Eager Загрузка с 1 ко многим и многими ко многим кораблям отношений - PullRequest
1 голос
/ 04 мая 2011

Я новичок в использовании Linq to SQL, и у меня возникла проблема

Это часть моей модели:

  • Visit> VisitProduct
  • Visit> VisitSample
  • Visit> VisitStatus

Я хочу загрузить объект посещения всеми связанными объектами, но он дает мне «InvalidCastexception»., Я использую этот код:

using (TeamsExcellenceDataContext context = new TeamsExcellenceDataContext())


{


            DataLoadOptions lo = new DataLoadOptions();
            context.DeferredLoadingEnabled = false;
            lo.LoadWith<Visit>(v => v.Visitstatus);
            lo.LoadWith<Visit>(v => v.VisitProducts);
            lo.LoadWith<Visit>(v => v.VisitSamples);

            context.LoadOptions = lo;
            var temp = (from v in context.Visits
                   where v.VisitID == visitID
                   select v).Single();
            Visit v = temp;
        }

Сгенерированный оператор SQL разделен на 2 части ( Я не знаю, почему это происходит? ):

SELECT [t0].[VisitID], [t0].[StartDate], [t0].[EndDate], [t0].[TypeID], [t0].[StatusID], [t0].[NextObjective], [t0].[CpFeedback], [t0].[Feedback], [t0].[AccID], [t0].[CustMPID], [t0].[AccTreeID], [t0].[RepPermitDays], [t0].[ModeTypeID], [t0].[Recurrence], [t0].[RecurrenceParentKey], [t0].[CDate], [t2].[VisitID] AS [VisitID2], [t2].[ProductID], [t2].[VisitProductTurn], [t2].[CDate] AS [CDate2], (
    SELECT COUNT(*)
    FROM [dbo].[VisitProducts] AS [t3]
    WHERE [t3].[VisitID] = [t0].[VisitID]
    ) AS [value], [t1].[VisitStatusID], [t1].[VisitStatusName], [t1].[VisitStatusMarker], [t1].[CDate] AS [CDate3]
FROM [dbo].[Visits] AS [t0]
INNER JOIN [dbo].[Visitstatus] AS [t1] ON [t1].[VisitStatusID] = [t0].[StatusID]
LEFT OUTER JOIN [dbo].[VisitProducts] AS [t2] ON [t2].[VisitID] = [t0].[VisitID]
WHERE [t0].[VisitID] = @p0
ORDER BY [t0].[VisitID], [t1].[VisitStatusID], [t2].[ProductID]
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [411]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

SELECT [t0].[VisiteID], [t0].[ProductID], [t0].[SampleQuantity], [t0].[CDate]
FROM [dbo].[VisitSamples] AS [t0]
WHERE [t0].[VisiteID] = @x1
-- @x1: Input Int (Size = -1; Prec = 0; Scale = 0) [411]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1/

Исключение не произойдет, если я пропущу эту строку:

lo.LoadWith<Visit>(v => v.Visitstatus);

ИЛИ любую из этих строк

lo.LoadWith<Visit>(v => v.VisitSamples);
lo.LoadWith<Visit>(v => v.VisitProducts);

Что я делаю неправильно или как я могу обойти эту проблему

1 Ответ

0 голосов
/ 14 мая 2011

Проблема заключалась в том, что выдается исключение InvalidCastexception, так как первичный ключ для таблицы Visitstatus имеет тип tinyint, и, очевидно, у Linq To SQl есть проблема с этим типом данных БД, поэтому я изменил тип tinyint на int, и он работает !! !

Таким образом, возникает вопрос: а что, если мне не разрешено изменять дизайн базы данных, или крайне важно использовать тип базы данных tinyInt? Есть ли обходной путь?

...