Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма 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 ()
Это сценарий, когда делать это таким образом не подходит. Вы строите фактический SQL (это то, что запятые и кавычки), и передавая его в качестве параметра. Это в основном оценка value3 IN ('...')
, где ...
является полнотой $values
.
Также это хороший вызов о кавычках. MySQL использует одинарные кавычки.
Вам нужно либо построить SQL, используя только конкатенацию строк, либо использовать несколько параметров.
EDIT
Как Пример:
$values = array('a','b','c','d');
$values = "'" . implode("','", $values) . "'";
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (' . $values . ')');
Прошел через некоторую информацию (см. также: https://stackoverflow.com/a/13253440/165330 ).
Он может , но НЕ ДОЛЖЕН быть выполнен.
Способ сделать это, будет использовать динамические переменные для предоставления переменных с автоопределением и с помощью call_user_func_array для подачи динамического количества аргументов обратного вызова / метода $ stmt-> bind_param () .
<?php
$values = array('a','b','c','d');
$s = substr( str_repeat( ' , ?' , count( $values ) ) , 2 );
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (' . $s . ')');
# OR array_map in case of different datatypes
$typeDefintions = str_repeat( 's' , count( $values ) );
$params = array( $typeDefinitions );
foreach ( $values as $k => $v ) {
${ 'varvar' . $k } = $v;
$params[] = &${ 'varvar' . $k };# provide references
}
call_user_func_array( array( $stmt , 'bind_param' ) , $params );