Подтвердить что ты не робот

Свойство "X" в "Y" не может быть установлено в значение "null". Вы должны установить это свойство в ненулевое значение типа 'Int32'

Когда я запускаю свое приложение, и я нажимаю на определенную кнопку, я получаю ошибку:

"The "X" property on "Y" could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'."

Прохладный, поэтому я иду в проект Entity, перехожу в таблицу Y, найдите столбец X, щелкните правой кнопкой мыши и перейдите к свойствам X и обнаружите, что для Nullable установлено значение False.

Я проверяю в SQL, что в таблице Y X устанавливается так, чтобы разрешать null, и это.

Затем я возвращаюсь к моему проекту Entity, устанавливаю Nullable в True, сохраняю и строю, и получаю:

Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property.

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

Я слышал, что это может быть в представлении, может быть в хранимой процедуре...

Также слышал, что это ошибка.

Кто-нибудь сталкивался с этим и обнаружил исправление "по всей доске" или какую-то дорожную карту, на которой можно найти эту ошибку?

Спасибо!

4b9b3361

Ответ 1

 "The "X" property on "Y" could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'."

В вашем EDMX, если вы перейдете под свою таблицу Y и щелкните по столбцу X, щелкните правой кнопкой мыши, выберите "Свойства", прокрутите вниз до Nullable и измените с False на True.

Если вы получите ошибку "фрагмента отображения", вам придется удалить таблицу из EDMX и повторно добавить ее, потому что в браузере моделей она хранит свойства таблицы и единственный способ обновить ее (что я знать) - удалить таблицу из Обозревателя моделей в <database>.Store, а затем извлечь ее с помощью команды Update Model from Database...

Ответ 2

Я просто заменяю тип данных int на int32?

public Int32 Field{ get; set; }

к

public Int32? Field{ get; set; }

и проблема решена.

Ответ 3

Для будущих читателей.

Я получил эту ошибку, когда у меня была хранимая процедура с несколькими результатами.

Как показано здесь:

http://msdn.microsoft.com/en-us/data/jj691402.aspx

Если вы попытаетесь получить доступ к элементу в первом результате, после выполнения .NextResult вы можете получить эту ошибку.

Из статьи:

    var reader = cmd.ExecuteReader();

    // Read Blogs from the first result set
    var blogs = ((IObjectContextAdapter)db)
        .ObjectContext
        .Translate<Blog>(reader, "Blogs", MergeOption.AppendOnly);   


    foreach (var item in blogs)
    {
        Console.WriteLine(item.Name);
    }        

    // Move to second result set and read Posts
    reader.NextResult();
    var posts = ((IObjectContextAdapter)db)
        .ObjectContext
        .Translate<Post>(reader, "Posts", MergeOption.AppendOnly);


    foreach (var item in posts)
    {
        Console.WriteLine(item.Title);
    }

Теперь, если до, строка

foreach (var item in posts)

вы ввели этот код

Blog foundBlog = blogs.FirstOrDefault();

Я думаю, вы можете имитировать ошибку.

Правило большого пальца:

Вы по-прежнему должны относиться к этой вещи как DataReader (пожарный шланг).

Для моих нужд мне пришлось преобразовать в List<>.

Итак, я изменил это:

    foreach (var item in blogs)
    {
        Console.WriteLine(item.Name);
    }  

:

    List<Blog> blogsList = blogs.ToList();
    foreach (var item in blogsList )
    {
        Console.WriteLine(item.Name);
    }  

И я смог перемещаться по объектам без получения ошибки.

Вот еще один способ, с которым я столкнулся.

    private void DoSomething(ObjectResult<Blog> blogs, ObjectResult<Post> posts)
    {

    }

И затем после этого кода (в исходном примере)

foreach (var item in posts)
{
    Console.WriteLine(item.Title);
}

введите этот код:

DoSomething(blogs,posts);

Если я назвал эту процедуру и начал доступ к элементам/свойствам в блогах и сообщениях, я столкнулся бы с проблемой. Я понимаю, почему я должен был поймать его в первый раз.

Ответ 4

Для меня следующие шаги исправили ошибку:

  • Удалите свойство X из таблицы Y.
  • Сохранить EDMX
  • создать базу данных из модели
  • компиляции
  • Повторно добавьте 'X'-свойство в' Y'-таблицу (с не-nullable и int16)
  • Сохранить EDMX
  • создать базу данных из модели
  • компиляции

Ответ 5

Я проверил, что объект указывает на правильную базу данных.

Затем я удалил таблицу из файла .edmx и добавил ее снова.

Проблема решена.

Ответ 6

Проверьте, что ваша модель и база данных должны быть определены соответственно....

public Int32? X {get; задавать; } ---- > Nullable Соответственно, в DB 'X' должно быть Nullable = True

или

public Int32 X {get; задавать; } ---- > not Nullable Соответственно, в DB 'X' должно быть Nullable = false

Ответ 7

Моя проблема заключалась в том, что база данных Model была не синхронизирована с фактической (dev) базой данных. Поэтому EDMX считал, что это был smallint, но фактический столбец был int. Я обновил базу данных модели до int и EDMX до Int32, и теперь она работает.

Ответ 8

чтобы исправить ошибку

 Error 3031: Problem in mapping fragments starting at line 4049:Non-nullable column "X" in table "Y" is mapped to a nullable entity property.

откройте файл EDMX с помощью редактора xml и найдите таблицу в

EDMX: StorageModels

найдите свойство, которое дает ошибку, и установите или добавьте

Nullable = "false" → to Nullable = "true"

сохранить edmx, открыть его в visual studio и построить его. проблема решена

Ответ 9

В моем случае в созданном представлении в столбце БД, который я выбираю, который содержит нулевое значение, я меняю это значение на этот оператор select:

До моего изменения

 select 
     ..., GroupUuId , ..

после моего изменения

 select 
     ..., ISNULL(GroupUuId, 0), ... 

Извините за мой плохой английский

Ответ 10

Это может произойти, когда таблица базы данных разрешает NULL и есть записи, которые имеют нулевое значение, и вы пытаетесь прочитать эту запись с помощью EF, и класс сопоставления не допускает нулевого значения.

Решение либо изменяет таблицу базы данных, чтобы она не допускала null, либо меняла свой класс на null.