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 Profiler,当调用 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将包含三个现有行和我的新行。但是,我无法在 SQL Server 中运行 SELECT 语句并查看我的新行。多次运行将得到相同的结果——数据库中现有的三行和永远不会进入数据库的新的第四行。

eventRegDB还包含为主键 ID 创建的 GUID;我假设 SQL 服务器会这样做,但不能 100% 确定这一点。

我采用了上述 TSQL 并在针对我的数据库的查询窗口中运行它 - 之后我在 Event_Registration 表中获得了新行 - 这就是创建三个现有行的方式。

我现在看到生成的异常或其他错误,找不到任何不保存到数据库的原因。有任何想法吗?如果您想查看 SQL 的架构、如何重新创建数据库、代码(任何或全部),然后询问 - 这都托管在http://animalrescue.codeplex.com/但我没有存储这个代码,还。

4

1 回答 1

1

你失踪了transaction.Complete(),所以你的交易永远不会被提交。当using块 forTransactionScope完成时,您的事务将回滚。

于 2012-07-04T21:08:04.733 回答