2009-04-29 55 views
1

我使用实体框架在ASP.NET MVC中实现我的数据accsee层。我在View中遇到问题。在ASP.NET MVC中使用实体框架时的问题

当我在VIEW类似代码:

我在运行时出现错误:未设置为一个对象的实例

对象引用。

描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及源代码的位置。

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

源错误:

线14:

线15:<%= Model.FirstName%> 第16行:

第17行:

这是从强类型的视图模板生成。 我确保我添加了模型referrence到web.config 我没有遇到这个错误,当我使用LINQ to SQL

任何帮助吗?

回答

1

我想通了! 问题是在VIEW 通常情况下,这将是, 使用(Html.BeginForm(新{ID = Model.Id}))

如果在你的数据库中的主键是类别ID,你会觉得你应该代码适应

编号= Model.CategoryID

但实际上,你应该像这样做,

使用(Html.BeginForm(新{类别ID = Model.CategoryID}))

否则,它不会填充模型。

重振,希望它有帮助!

0

它看起来好像您的模型未在控制器中正确填充。你的问题中没有足够的信息来确定究竟发生了什么问题。

+0

这就是我发现的奇怪。我无法提供更多信息,因为我不能。我可以使用<%= Html.Encode(Model.FirstName)%>但不是 <%= Model.FirstName%> – Smallville 2009-04-29 13:04:17

2

因为我不能评论一个答案,我会通过一个新的答案做到这一点.. 我注意到你的属性被称为“名字”,你有没有尝试做this教程? 这是您遇到问题的编辑操作?

因为这与我和我的同班同学所面对的问题完全相同。 这是问题的更详细的解释:

这是控制器的动作:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Contact contactToEdit) { 
    if (!ModelState.IsValid) 
     return View(); 

    try { 
     var originalContact = (from c in base._entities.ContactSet 
           where c.Id == contactToEdit.Id 
           select c).First(); 
     base._entities.ApplyPropertyChanges(originalContact.EntityKey.EntitySetName, contactToEdit); 
     base._entities.SaveChanges(); 

     return RedirectToAction("Index"); 
    } catch(Exception e) { 
     return View(); 
    } 
} 

当ApplyPropertyChanges被称为exception提高。 (InvalidOperationException异常) 异常消息:

{System.InvalidOperationException: The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'ContactManager.Models.Contact'.
at System.Data.Objects.ObjectContext.ApplyPropertyChanges(String entitySetName, Object changed)
at ContactManager.Controllers.HomeController.Edit(Contact contactToEdit) in C:\Users\Jeroen\Desktop\ContactManager\ContactManager\ContactManager\Controllers\HomeController.cs:line 65}

当添加ApplyPropertyChanges之前这一行:

System.Data.Objects.ObjectStateEntry x = base._entities.ObjectStateManager.GetObjectStateEntry(originalContact); 

X确实含有正确类型的一个条目。 (debug image

注:我做了一个从教程的小偏差,并把实体对象放在一个超类,所以我不必在我所有的控制器中声明相同的对象。但遵循教程时会出现同样的问题。

0

有时模型为空,因为带有方法.FirstOrDefault()的select语句没有带来有效的对象。

您可以随时将.FirstOrDefault()更改为.First()并重新编译您的解决方案。