Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма 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 ()
Вам нужен модифицированный синглтон. См. Это - те же OOPS (шаблоны проектирования)
Превратите свой класс через фабрику (см. шаблоны проектирования) и ограничьте его до 3 экземпляров с помощью простого счетчика.
Вы также можете посмотреть ObjectPool Apache Commons. Исходный код свободно доступен ...
Заводская схема - путь. Или можно использовать статический счетчик. Необходимо соблюдать осторожность в отношении безопасности потоков.
почему бы не назначить limInstance = null; в противном случае в getLimInstance ()? в этом случае он не будет предоставлять дубликаты obj3?
public static synchronized InstanceClass getLimInstance()
{
if(objCount < 3 ){
limInstance = new InstanceClass();
}
else
{
limInstance=null;
}
return limInstance;
}
public class LimitObjectCreationTest {
public static void main(String[] args) {
InstanceClass obj1 = InstanceClass.getLimInstance();
InstanceClass obj2 = InstanceClass.getLimInstance();
InstanceClass obj3 = InstanceClass.getLimInstance();
InstanceClass obj4 = InstanceClass.getLimInstance();
InstanceClass obj5 = InstanceClass.getLimInstance();
InstanceClass obj6 = InstanceClass.getLimInstance();
System.out.println(obj1);
System.out.println(obj2);
System.out.println(obj3);
System.out.println(obj4);
System.out.println(obj5);
System.out.println(obj6);
System.out.println(obj3);
}
}
Результат был следующим:
come.classinstance.InstanceClass@4a5ab2
come.classinstance.InstanceClass@1888759
come.classinstance.InstanceClass@6e1408
null
null
null
g8]come.classinstance.InstanceClass@6e1408
Мы можем ограничить создание объекта для определенного класса по малой модификации в шаблоне проектирования Singleton, как показано ниже:
public class LimitClass {
private static LimitClass limInstance;
public static int objCount = 0;
private LimitClass(){
objCount++;
}
public static synchronized LimitClass getLimInstance(){
if(objCount < 3 ){
limInstance = new LimitClass();
}
return limInstance;
}
}
public class LimitObjectCreationTest {
public static void main(String[] args) {
LimitClass obj1 = LimitClass.getLimInstance();
LimitClass obj2 = LimitClass.getLimInstance();
LimitClass obj3 = LimitClass.getLimInstance();
LimitClass obj4 = LimitClass.getLimInstance();
LimitClass obj5 = LimitClass.getLimInstance();
LimitClass obj6 = LimitClass.getLimInstance();
System.out.println(obj1);
System.out.println(obj2);
System.out.println(obj3);
System.out.println(obj4);
System.out.println(obj5);
System.out.println(obj6);
}
}
Вывод кода выше:
com.pack2.LimitClass@19821f
com.pack2.LimitClass@addbf1
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816
com.pack2.LimitClass@42e816
После создания трех разных объектов он повторяет один и тот же третий объект снова и снова. Он не создает другой объект.
Вам нужно изменить синглтон и создать три объекта. написать три метода в каждом методе вернуть объект, например, как вернуть разные три объекта и использовать, когда вам нужно. в основном, нет необходимости объявлять переменную или объект как статические, так как всегда возвращать один и тот же объект.