Ссылка на объект не установлена на экземпляр объекта
Я создаю приложение WCF с несколькими уровнями, и мне предоставляется это исключение при попытке добавить новый объект в БД. Я предоставлю вам примеры кода, пожалуйста, попробуйте помочь мне здесь. Ошибка на линии scenaristBLL.Insert(s);
Вот мой метод, в рамках которого я пытаюсь создать новый объект сценариев в ScenaristController
учебный класс:
[HttpPost]
public ActionResult Create(ScenaristViewModel fvm, List<int> scenarijId)
{
if (fvm != null)
{
if (String.IsNullOrEmpty(fvm.Scenarist.NameSurname) == true)
{
TempData["ValidationErrorIme"] = "validation err1";
return RedirectToAction("Create");
}
if (fvm.Scenarist.DateOfBirth == null)
{
TempData["ValidationErrorGodina"] = "validation err2";
return RedirectToAction("Create");
}
Scenarist s = new Scenarist();
s.NameSurname = fvm.Scenarist.NameSurname;
s.DateOfBirth = fvm.Scenarist.DateOfBirth;
s.dateOfDeath = fvm.Scenarist.dateOfDeath;
scenaristBLL.Insert(s); // PROBLEM!
s = scenaristBLL.Fetch(s.Id);
foreach (int scenarij in scenarijId.Where(z => z != 0))
{
Scenarij scn = scenarijBLL.Fetch(scenarij);
if (scn == null)
{
return new HttpNotFoundResult("Nepostojeći scenaristId: " + scenarij.ToString());
}
scenarijBLL.AddToScenarist(scn, s);
}
}
return RedirectToAction("Index");
}
Также вот класс View для него:
<table>
<tr>
<td>Name and surname:</td>
<td>@Html.TextBoxFor(modelItem => Model.Scenarist.NameSurname) @TempData["ValidationError1"]</td>
</tr>
<tr>
<td>Date of birth:</td>
<td>@Html.TextBoxFor(modelItem => Model.Scenarist.DateOfBirth) @TempData["ValidationError2"]</td>
</tr>
<tr>
<td>Datum of Death:</td>
<td>@Html.TextBoxFor(modelItem => Model.Scenarist.DateOfDeath) @TempData["ValidationError3"]</td>
</tr>
</table>
Я думаю, что DateOfBirth и DateOfDeath могут быть проблемой, так как они в формате DateTime, и я не уверен, как получить формат DateTime из пользовательского ввода. Просто предположение, действительно не уверен.
Кроме того, вот другие слои для этого... BLL:
public void Insert(Scenarist scenarist)
{
string error;
if (scenarist.Validate(out error) == true)
{
string[] nameSurname = scenarist.NameSurname.Split(' ');
string name = nameSurname[0];
string surname = nameSurname[1];
dal.Insert(name, null, surname, scenarist.DateOfBirth, scenarist.DateOfDeath);
}
else
{
throw new ArgumentException("Validation error: " + error);
}
}
DAL:
public void Insert(string name, string middleName, string surname,
DateTime? dateOfB, DateTime? dateOfD)
{
using (RPPP111Entities ctx = new RPPP111Entities())
{
Scenarist scenarist = new Scenarist();
scenarist.Person.Name = name;
scenarist.Person.Middlename = middleName;
scenarist.Person.surname = surname;
scenarist.Person.DateOfB = dateOfB;
scenarist.Person.DateOfD = dateOfD;
ctx.Scenarist.Add(scenarist);
ctx.SaveChanges();
}
}
2 ответа
Наверное scenarist.NameSurname
(Вставить функцию) является нулевым, потому что в вашем представлении вы получили modelItem => Model.Scenarist.NameSurnameScenarist
,
РЕДАКТИРОВАТЬ:
Учебник по отладке: http://www.youtube.com/watch?v=C0vDKXIq_9A
EDIT2:
Вы создали экземпляр Person
в (вставить функцию DAL):
scenarist.Person.Name
Если проблема действительно происходит, когда вы нажмете scenaristBLL.Insert(s); // PROBLEM!
, тогда единственный способ, которым это может произойти, - это если значение scenaristBLL равно нулю. Возможно, Insert должна быть статической функцией, а scenaristBLL должен быть абстрактным классом.
Вы можете подтвердить это, запустив и затем, когда вы нажмете на ошибку, наведите курсор мыши на scenaristBLL. Он скажет, если это ноль.
Спасибо @Matt Johnson за то, что заметил это.