#c# #entity-framework #linq
#c# #entity-framework #linq
Вопрос:
Я получаю следующие ошибки, все они связаны с system.linq. Странно то, что метод, похоже, иногда работает, ошибки происходят не всегда.
Код Count():
using (var dbContext = new Entities(GlobalStuff.EntityConnection))
{
heartBeat.NumSlipsInSecurityUploadQueue = dbContext.SecurityUploadQueues.Count();
heartBeat.NumSlipsInDataStreamQueue = dbContext.DataStreamQueues.Count();
}
Свойство SecurityUploadQueues:
Public ReadOnly Property SecurityUploadQueues() As ObjectSet(Of SecurityUploadQueue)
Get
If (_SecurityUploadQueues Is Nothing) Then
_SecurityUploadQueues = MyBase.CreateObjectSet(Of SecurityUploadQueue)("SecurityUploadQueues")
End If
Return _SecurityUploadQueues
End Get
End Property
Private _SecurityUploadQueues As ObjectSet(Of SecurityUploadQueue)
Свойство SecurityUploadQueue является объектом EntityObject
Count() Ошибка:
Ошибка при загрузке системы HeartBeat.Исключение InvalidOperationException: последовательность содержит более одного элемента
в System.Linq.Перечисляемый.Одиночный [TSource] (IEnumerable1 source)
1.b__11_3(IEnumerable
at System.Data.Objects.ELinq.ObjectQueryProvider.<>c__111 sequence)
1 запрос, выражение queryRoot)
at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable
в System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Выполните[S](выражение expression)
в System.Linq.Запрашивается.Подсчитайте[TSource](IQueryable`1 источник)
в SettlerService.SettlerService.UploadHeartBeat()
Любой() код:
var dataToUpload = (from bet in dbContext.DataStreamQueues select bet).Take(200);
if (dataToUpload.Any())
Ошибка Any():
Система.Исключение InvalidOperationException: указанное приведение из материализованного типа ‘System.Int32’ в ‘System.Недопустимый тип Boolean’. в System.Data.Обычный.Внутреннее.Материализация.Формирователь.Ошибка при обработке valuereader
1.GetValue(DbDataReader
1.ReadNextElement (формирователь shaper) в System.Data.Обычный.Внутреннее.Материализация.Формирователь
reader, Int32 ordinal) at lambda_method(Closure , Shaper ) at
System.Data.Common.Internal.Materialization.Coordinator1.SimpleEnumerator.MoveNext()
1 источник) в System.Data.Objects.ELinq.ObjectQueryProvider.<> последовательность c__11
at System.Linq.Enumerable.Single[TSource](IEnumerable1.<GetElementFunction>b__11_3(IEnumerable
1) в System.Data.Objects.ELinq.ObjectQueryProvider.Выполните один [TResult](IEnumerable1
1 источник)
query, Expression queryRoot)
at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Linq.Queryable.Any[TSource](IQueryable
в SettlerService.SettlerService.UploadDataStream()
Я немного погуглил и не могу найти много по этой проблеме. Я подумал, что это может быть связано с версией библиотеки system.core (частью которой является system.linq), но не смог увидеть проблему. Я использую .Net 4.7.2
Комментарии:
1. Похоже, вы используете Entity Framework. Похоже, у вас есть некоторые сопоставления EF, на которые необходимо обратить внимание.
2. Вы правы, мы используем Entity Framework 5. Какое сопоставление могло бы вызвать ошибки?
3. Как
dbContext.SecurityUploadQueues
определяется?4. Итак, dbcontext определен в первом edmx-файле базы данных, SecurityUploadQueues — это таблица в базе данных
5. Судя по ошибке, похоже, что
SecurityUploadQueues
свойство являетсяIQueryable
, которое уже содержитExpression
, и оно может не указывать непосредственно наDbSet<>
. Но это трудно сказать без того, чтобы вы не показали код
Ответ №1:
Вторая ошибка подразумевает, что в вашей DataStreamQueues
таблице базы данных есть один столбец с типом Int32
, но тип эквивалентного свойства в DataStreamQueues
сущности — bool ; поэтому проверьте, совпадают ли все столбцы и типы свойств.
Что касается первого исключения, это немного странно! поскольку это исключение предполагает, что где-то в вашем коде вы вызываете метод Single() для набора, который содержит несколько элементов, и поскольку Single()
ожидается только один элемент, он выдает исключение, однако я не вижу никаких вызовов Single()
в предоставленном коде.