0

私は EF-SaveChanges に関するほとんどすべての投稿を読みましたが、私の答えがそれらの投稿のいずれにもあるとは思いません。

C#、.NET 4、EF 4.3.1、SQL Server 2008R2、VS 2k11 Beta、AutoMapper を使用しています。

これが私のコードです:

using (Model.AnimalRescueEntities context = new Model.AnimalRescueEntities())
{
    using (TransactionScope transaction = new TransactionScope())
    {
        context.Connection.Open();

        //Retrieve the event
        eventDB = context.Events.Single(e => e.ID == eventRegVM.EventID);
        eventOrgBaseDB = context.Entity_Base.Single(b => b.ID == eventDB.Entity_Organisation.ID);
        eventRegVM.Event = Mapper.Map<Model.Event, EventsViewModel>(eventDB);
        eventRegVM.Event.Entity_Organisation.Entity_Base = Mapper.Map<Model.Entity_Base, Entity_BaseViewModel>(eventOrgBaseDB);

        //saves Event_Registration
        eventRegDB = Mapper.Map<Event_RegistrationViewModel, Model.Event_Registration>(eventRegVM);
        eventRegDB.Event = eventDB;
        eventRegDB.EventID = eventDB.ID;
        eventRegDB.Event.Entity_Organisation = context.Entity_Organisation.Single(o => o.ID == eventOrgBaseDB.ID);
        eventRegDB.Event.Entity_Organisation.Entity_Base = eventOrgBaseDB;

        //Add the link between EVENT and REGISTRATION
        context.Event_Registration.AddObject(eventRegDB);
        int numChanges = context.SaveChanges();

        var regs = context.Event_Registration.Where(r => r.ID != null).ToList();
    }
}

バックグラウンドで SQL プロファイラーを実行していて、SaveChanges が呼び出されると、次の SQL コードが表示されます ( numChangesは 1):

exec sp_executesql N'declare @generated_keys table([ID] uniqueidentifier)
insert [dbo].[Event_Registration]([EventID], [DateSubmitted], [HasPaid], [PaymentMethod], [Comments], [AmountPaid])
output inserted.[ID] into @generated_keys
values (@0, @1, null, @2, null, @3)
select t.[ID]
from @generated_keys as g join [dbo].[Event_Registration] as t on g.[ID] = t.[ID]
where @@ROWCOUNT > 0',N'@0 uniqueidentifier,@1 datetime2(7),@2 int,@3 decimal(19,4)',@0='1D841F75-AEA1-4ED1-B3F0-4E3994D7FC0D',@1='2012-07-04 14:59:45.5239309',@2=0,@3=0

regsには、既存の 3 つの行と新しい行が含まれます。ただし、SQL Server で SELECT ステートメントを実行できず、新しい行が表示されません。これを何度も実行すると、同じ結果が得られます。データベース内に 3 つの既存の行があり、データベースに到達しない新しい 4 行目です。

eventRegDBには、主キー ID 用に作成された GUID も含まれています。SQLサーバーがこれを行うと思いますが、100%確実ではありません。

上記の TSQL を取得し、データベースに対してクエリ ウィンドウで実行しました。その後、Event_Registration テーブルに新しい行を取得しました。これにより、3 つの既存の行が作成されました。

例外やその他のエラーが生成されていることがわかりましたが、これがデータベースに保存されない理由が見つかりません。何か案は?SQL のスキーマ、データベースの再作成方法、コード (一部またはすべて) を確認したい場合は、質問してください。これはすべてhttp://animalrescue.codeplex.com/でホストされていますが、保存していません。コード、まだ。

4

1 に答える 1

1

あなたがいなくなっtransaction.Complete()たので、あなたのトランザクションは決してコミットされません。usingブロックが完了するTransactionScopeと、トランザクションはロールバックされます。

于 2012-07-04T21:08:04.733 に答える