Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.
Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()
Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line
Ради полноты класса DataContext
public class DataContext : DbContext
{
public DbSet Contacts {get; set;}
}
и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.
public partial class Contact
{
public string Name {get; set;}
}
Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.
Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.
Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()
Чаще всего это проблема с разрешениями. Я предполагаю, что у вас нет прямого доступа к оболочке для непосредственного контроля этого материала, поэтому вот как это сделать изнутри скрипта:
Проверьте, существует ли каталог $target
:
$target = '/data/etc....';
if (!is_dir($target)) {
die("Directory $target is not a directory");
}
Проверьте, можно ли его записать:
if (!is_writable($target)) {
die("Directory $target is not writeable");
}
Проверьте, существует ли полное имя файла цели / доступно для записи - возможно, оно существует, но не может быть перезаписано:
$target = $target . basename($_FILES['image']['name']);
if (!is_writeable($target)) {
die("File $target isn't writeable");
}
Помимо этого:
if(!(move_uploaded_file($_FILES['image']['tmp_name'], $target))) {
echo $_FILES['image']['error']."<br />";
}
Повторение параметра error
здесь бесполезно, оно относится исключительно к процессу загрузки. Если файл был загружен правильно, но его нельзя было перенести, это будет по-прежнему вызывать только 0
(например, константу UPLOAD_ERR_OK). Правильный способ проверки ошибок выглядит примерно так:
if ($_FILES['images']['error'] === UPLOAD_ERR_OK) {
// file was properly uploaded
if (!is_uploaded_File(...)) {
die("Something done goofed - not uploaded file");
}
if (!move_uploaded_file(...)) {
echo "Couldn't move file, possible diagnostic information:"
print_r(error_get_last());
die();
}
} else {
die("Upload failed with error {$_FILES['images']['error']}");
}
Вам нужно убедиться, что у того, кто размещает ваши страницы, настроены параметры, позволяющие загружать и перемещать файлы.
Просто отправьте их по электронной почте и спросите, включены ли они.
Надеюсь, что это поможет.
ваши вызовы is_uploaded_file и move_uploaded_file различаются. для is_uploaded_file вы проверяете имя и имя move_uploaded_file, которое вы передаете в 'tmp_name'. попробуйте изменить свой вызов на move_uploaded_file, чтобы использовать 'name'