C# Entity Framework 4 Common Language Runtime обнаружена недопустимая ошибка программы?

как вы отлаживаете / исправляете ошибку "Общеязыковая среда выполнения обнаружила недопустимую программу"? Что это вообще значит?

у меня есть веб-приложение C# MVC 2, которое может быть развернуто на двух веб-сайтах, находящихся на одном веб-сервере IIS 7.5 (x64). Один-это живой сайт (развернутый с использованием конфигурации выпуска), второй-бета-сайт (развернутый с использованием новой бета-конфигурации, созданной только для этого проекта).

эти два веб-сайта:

Default Website/my_app
Beta/my_app

на бету сайт при выборе выгружаемого списка заказов на покупку выдает исключение" обнаружена недопустимая программа". Точно такой же код при запуске на живом сайте работает отлично. Зачем он это сделал?

Edit: я установил Visual Studio на сервере и нашел фактическую строку, которая вызывала проблему, и трассировку стека:

var list = ObjectContext.ObjectSet.AsQueryable();
int totalRecords = list.Count();
var paged = list.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows);

и это сообщение об исключении с трассировкой стека:

{System.InvalidProgramException: Common Language Runtime detected an invalid program.
   at System.Data.Entity.DynamicProxies.PurchaseOrderListVie_96479BFE9FA60F4C53137C56C1A1B2A11D90FF5AFFDC20383CC68E0A750792E3.set_Total(Decimal )
   at lambda_method(Closure , Shaper )
   at System.Data.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
   at lambda_method(Closure , Shaper )
   at System.Data.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
   at System.Data.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at MyApp.Controllers.PurchaseOrderController.GetPurchaseOrderList(Int32 page, Int32 rows, String sidx, String sord) in C:srcMyApp.2010MyApp.UIControllersPurchaseOrderList.cs:line 11}

эта новая информация показывает, где именно проблема, но не в чем проблема. Надеюсь, кто-то, кто очень хорошо знает Entity framework, может пролить свет на это:

System.Data.Entity.DynamicProxies.PurchaseOrderListVie_96479B_etc.set_Total(Decimal )

- строка, в которой происходит ошибка. Теперь я запустил запрос в SQL management studio, и результат не был нулевым, и Total тоже не был нулевым. Так почему же возникла проблема с вызовом set_Total ()?

вот как POCO определяет общее поле (сгенерированное шаблоном T4):

[Decimal] [Required] [DisplayName("Total")]
public virtual decimal Total
{
    get;set;
}

основное различие между живыми и бета-сайтов является конфигурация построения. Но обе конфигурации имеют каждый отдельный проект, установленный на "любой процессор".

все наши машины и серверы развития 64 бита. Может ли быть какая-то разница между конфигурацией IIS веб-сайтов, которая вызывает это?

Я пробовал запустить PEVerify-но он просто говорит: "все классы и методы проверены."Как PEVerify может помочь с этим типом проблемы?

кстати, я вижу, что есть около 15 вопросов с "общим Языковая среда выполнения обнаружила недопустимую проблему с программой " в заголовке. Мой вопрос не является дубликатом и имеет несколько уникальных функций, которые отличаются от других вопросов, которые имеют аналогичный заголовок (и только один из этих 15 тоже касается Entity Framework - остальные касаются отражения или TFS)

4 ответов


Я столкнулся с этой проблемой сегодня, когда я развернул веб-приложение, реализующее linq to entity 4 в нашей среде QA. Проблема оказалась параметром IIS на сервере Windows 2008 R2. В разделе Дополнительные параметры пула приложений для параметра включить 32-разрядные приложения установлено значение False. Я установил его в True, и теперь мое приложение работает так же, как и на сервере разработки, который оказался сервером Windows 2003. Надеюсь, это поможет.


для меня это произошло, когда я добавил для моей модели сущностей. По умолчанию конструктор задает для всех столбцов свойство Entity Key значение true. Когда я устанавливаю значение false для всех десятичных / числовых столбцов, ошибка исчезает. ТАС


вы пытались развернуть бета-конфигурацию на другой машине? Ваша настройка apppools должна быть одинаковой (т. е. классической vs интегрированной, той же версии .net)? Вы пробовали очистить решение и повторно использовать его в новом месте? Вы пробовали развернуть beta build для выпуска location? (обязательно удалите все файлы перед публикацией; im любопытно, если есть оставшаяся динамически загруженная зависимость, которая может вызвать проблемы)

обновление:

превосходный wrt больше информация. В строке 3 вы определяете страницу переменной, а также используете ранее определенную переменную с именем page. Как это компилируется? Попробуйте прокомментировать этот код или, по крайней мере, попробуйте его без пропуска.

примечание: Я думаю, что Count (), за которым следует Take (), может выполнять запрос дважды.

NOTE2: я использовал только первую разработку базы данных EntityFramework v4, но я не помню программирования непосредственно против ObjectSet. Обычно это ваша сущность класса (например, MyContext.Порядки.).. Возможно, что-то происходит с программированием против этого объекта и установкой десятичного значения. Есть ли какие-либо свойства в модели для этого свойства, которые делают его нестандартным?


существует серьезная ошибка!!, я думаю, что это при наличии свойства столбца десятичного поля в Entity framework,

Я столкнулся с этой неприятной ошибкой msg, я сравнил получение данных из 2 отдельных таблиц (те же таблицы),один с целочисленным идентификатором столбца, а другой с десятичным идентификатором столбца,

для таблицы с целочисленным столбцом, без проблем тот же код работал отлично, для таблицы с десятичным столбцом это сообщение об ошибке выскакивает я сделал проверки на SQL server iis и окружающая среда, и я даже хотел отформатировать ПК, его очень странно, и ошибка msg не ясна.

надеюсь, что этот подход поможет любому, кто столкнется с такой ошибкой в будущем.