2012-05-17 10 views
1

我正在試驗VS 2011 Beta和EF,我遇到了UpdateEntity問題,但是InsertEntity和DeleteEntity正常工作。DbDataConttoller UpdateEntity引發異常

問題是,當我調用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類中定義這個測試對象:

public DbSet<Test> Test { get; set; } 

當然我在我的數據庫中有一個名爲Test的表,這是創建scr IPT爲表:

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(entity);

裏面的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 。 <> c_ DisplayClass42.b _41() at System.Web.Mvc.Async.AsyncResultWrapper。 <> 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。 <> c _DisplayClass37。 <> c_ DisplayClass39.b _33() at System.Web.Mvc.Async.AsyncControllerActionInvoker。 <> c_ DisplayClass4f。b _49()

任何人都有任何線索可能是錯誤的?

回答

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