Свойство «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, а затем повторное добавление, это возможность, но она никогда не делала этого и не понимала последствий, достаточных для того, чтобы чувствовать себя комфортно в этом.

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

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

Кто-нибудь сталкивался с этим и обнаружил, что «по всем направлениям» исправить или, что-то вроде дорожной карты, где искать эту ошибку?

Благодаря!

  "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.. .

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

 public Int32 Field{ get; set; } 

в

 public Int32? Field{ get; set; } 

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

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

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

Как видно здесь:

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); 

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

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

  1. Удалите свойство «X» из таблицы «Y»
  2. Сохранить EDMX
  3. создать базу данных из модели
  4. компилировать
  5. Добавьте снова X-свойство в Y-таблицу (с не-nullable и int16)
  6. Сохранить EDMX
  7. создать базу данных из модели
  8. компилировать

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

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

Задача решена.

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

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

или

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

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

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

  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 и построить его. задача решена

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

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

  select ..., GroupUuId , .. 

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

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

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

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

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