我正在尝试使用VS 2011 Beta和EF,但我遇到了UpdateEntity问题,但InsertEntity和DeleteEntity工作正常。
问题在于,当我调用UpdateEntity时,我得到一个“对象引用未设置为对象的实例”异常。
我的项目中的所有模型似乎都会发生。
为了尝试隔离问题,我创建了一个非常简单的具有基本属性的DTO类,但是当我尝试在该对象上调用UpdateEntity时,我得到了同样的错误。这是我的代码:
测试DTO:
[Table("Test")]
public class Test
{
[Key, Column]
public int Id { get; set; }
[Column]
public string TestMember { get; set; }
}
我有一个DbDataController,其中包含以下方法:
public void InsertTest(Test entity)
{
InsertEntity(entity);
}
public void UpdateTest(Test entity)
{
UpdateEntity(entity);
}
public void DeleteTest(Test entity)
{
DeleteEntity(entity);
}
最后,我在DbContext类中定义了这个Test对象:
public DbSet<Test> Test { get; set; }
当然我的数据库中有一个名为Test的表,这是表的创建脚本:
CREATE TABLE [dbo].[Test](
[ID] [int] IDENTITY(1,1) NOT NULL,
[TestMember] [nvarchar](50) COLLATE Icelandic_CI_AS NOT NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
我可以成功地将新测试对象插入数据库:
using (DataController dataSource = new DataController())
{
Test test = new Test();
test.Id = 1;
test.TestMember = "test2";
dataSource.InsertTest(test);
dataSource.SaveChanges();
}
然后我可以轻松地从数据库中删除它:
using (DataController dataSource = new DataController())
{
Test test = new Test();
test.Id = 1;
test.TestMember = "test2";
dataSource.DeleteTest(test);
dataSource.SaveChanges();
}
但如果我尝试这样做:
using (DataController dataSource = new DataController())
{
Test test = new Test();
test.Id = 1;
test.TestMember = "UpdatedTest";
dataSource.UpdateTest(test);
dataSource.SaveChanges();
}
我得到一个“对象引用未设置为对象的实例”。此行的例外:
UpdateEntity(实体);
在DataController中的UpdateTest方法中。
没有InnerException,堆栈跟踪也没有用处:
在System.Web.Http.Data.EntityFramework.DbDataController
1.UpdateEntity(Object entity) at Hot.Web.Controllers.DataController.UpdateTest(Test entity) in c:\......\DataController.cs:line 48 at Hot.Web.Controllers.UserManagementController.EditProfile() in c:\.......\UserManagementController.cs:line 223 at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary
2个参数) 在System.Web.Mvc.Async.AsyncControllerActionInvoker。&lt;&gt; c_ DisplayClass42.b _41() 在System.Web.Mvc.Async.AsyncResultWrapper。&lt;&gt; c_ DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult
1.End() 在System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) 在System.Web.Mvc.Async.AsyncControllerActionInvoker。&lt;&gt; c _DisplayClass37。&lt;&gt; c_ DisplayClass39.b _33() 在System.Web.Mvc.Async.AsyncControllerActionInvoker。&lt;&gt; c_ DisplayClass4f.b _49()
任何人都有任何线索可能出错?
答案 0 :(得分:0)
您需要查询实体,然后使用dbcontroller
更新检索到的实体using (DataController dataSource = new DataController()) {
Test test = dataSource.getById(1); //Use whatever query method you need to here
test.TestMember = "UpdatedTest";
dataSource.UpdateTest(test);
dataSource.SaveChanges();
}