【问题标题】:EntityFramework - SaveChanges not saving but SQL seen in ProfilerEntityFramework - SaveChanges 不保存但在 Profiler 中看到 SQL
【发布时间】:2012-07-04 20:38:36
【问题描述】:

我已经阅读了关于 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 还包含为主键创建的 GUID,ID;我假设 SQL Server 会这样做,但不能 100% 确定这一点。

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

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

【问题讨论】:

    标签: asp.net-mvc-3 c#-4.0 sql-server-2008-r2 entity-framework-4.3


    【解决方案1】:

    您缺少transaction.Complete(),因此您的事务永远不会提交。当TransactionScopeusing 块完成时,您的事务将回滚。

    【讨论】:

    • 谢谢你,Mmka。很高兴我错过了一件简单的事情!
    猜你喜欢
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多