Как получить пройти эту ошибку "Значение не может быть нулевым. Имя параметра: сущность" - PullRequest
1 голос
/ 02 июня 2011
        private void button1_Click(object sender, EventArgs e)
    {

        DataClasses1DataContext dc = new DataClasses1DataContext();
        var rec = dc.reportsSents.FirstOrDefault();
        int rowCount = dc.reportsSents.Count();


        if (rec != null)
            {

            for(int i = 0; i <= rowCount;)
                {


                    var matchedCaseNumber = (from CaseNumberKey in dc.GetTable<reportsSent>()
                                     select CaseNumberKey).FirstOrDefault();

                    (new MyReportRenderer()).RenderTest(Convert.ToString(matchedCaseNumber));

                    dc.reportsSents.DeleteOnSubmit(matchedCaseNumber);
                    dc.SubmitChanges();

                    i = (i +1);

                } 

             }  

При выполнении кода выше я получаю эту ошибку:

Значение не может быть нулевым.Имя параметра: entity

и matchedCaseNumber выделяется в этой строке:

dc.reportsSents.DeleteOnSubmit (matchedCaseNumber);

Что это значит и почему я это получаю.То, что я пытаюсь сделать, это передать MatchedCaseNumber методу, а затем удалить его после выполнения метода, а затем пройтись по таблице.Любая помощь будет оценена.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 02 июня 2011

У вас есть

var matchedCaseNumber = (...).FirstOrDefault();

dc.reportsSents.DeleteOnSubmit(matchedCaseNumber);

Так что, если matchedCaseNumber равно нулю? OrDefault делает это возможным.

Измените эту 2-ю строку на:

if (matchedCaseNumber != null)
    dc.reportsSents.DeleteOnSubmit(matchedCaseNumber);

Кроме того,

int rowCount = dc.reportsSents.Count();

for(int i = 0; i <= rowCount;)
{
   ...
   i = (i +1);    
}

вероятно должно стать:

for(int i = 0; i < rowCount; i += 1)  // note: NOT <=
{
    ...    
}

Вы перебираете rowCount + 1 раз. И в действительности нет никакого смысла перемещать приращение i из оператора цикла. Не путайте / не мешайте оптимизаторам.

1 голос
/ 02 июня 2011

Это означает, что matchCaseNumber равно null.

. При создании matchCaseNumber используется .FirstOrDefault(), который возвращает первый экземпляр или значение по умолчанию для этого типа (которое null для ссылочных типов).).

Другими словами, ваш запрос:

from CaseNumberKey in dc.GetTable<reportsSent>()
select CaseNumberKey

не возвращает никаких данных.

1 голос
/ 02 июня 2011

matchedCaseNumber вероятно null при передаче на DeleteOnSubmit

if(matchedCaseNumber != null)
{
  dc.reportsSents.DeleteOnSubmit(matchedCaseNumber);
  dc.SubmitChanges();
}

EDIT: Если я правильно понимаю, что вы пытаетесь сделать, это было бы лучше:

private void button1_Click(object sender, EventArgs e)
{

    DataClasses1DataContext dc = new DataClasses1DataContext();

    foreach (var item in dc.reportsSents)
    {
        (new MyReportRenderer()).RenderTest(Convert.ToString(item));
        dc.reportsSents.DeleteOnSubmit(item);
    }
    dc.SubmitChanges();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...