Свойство "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 файла, а затем повторное добавление, это возможность, но никогда этого не делала и не понимала последствий, достаточных для того, чтобы чувствовать себя комфортно в этом.
Я слышал, что это может быть в представлении, может быть в хранимой процедуре...
Также слышал, что это ошибка.
Кто-нибудь сталкивался с этим и обнаружил исправление "по всей доске" или какую-то дорожную карту, на которой можно найти эту ошибку?
Спасибо!
Ответы
Ответ 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.