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.<>c_ DisplayClass42.b _41() で System.Web.Mvc.Async.AsyncResultWrapper.<>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.<>c _DisplayClass37.<>c_ DisplayClass39.b _33() で System.Web .Mvc.Async.AsyncControllerActionInvoker.<>c_ DisplayClass4f.b _49()
誰が何が間違っているのか手がかりを得ましたか?