DbDataConttoller UpdateEntity抛出异常

时间:2012-05-17 12:42:21

标签: .net entity-framework-4.1 asp.net-mvc-4

我正在尝试使用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_ DisplayClass8 1.<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()

任何人都有任何线索可能出错?

1 个答案:

答案 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();
    }