使用WCF事务插入多个表

时间:2016-04-21 19:49:56

标签: c# asp.net entity-framework wcf transactions

我正在尝试将一个条目添加到表中,并使用该添加条目的主键来创建另一个表的附加条目。

我得到的错误是

  

事务管理器已禁用其对远程/网络的支持   交易。 (HRESULT异常:0x8004D024)

我认为这是由在单个TransactionScope中创建多个连接引起的,但是我在一个context / using语句中做了所有事情,所以我不相信我应该收到这个错误。

服务

    [OperationBehavior(TransactionScopeRequired = true)]
    public void CreateGroup(NewGroupData data)
    {
        var groupRepo = _GroupRepo ?? new InvestigatorGroupRepository();
        groupRepo.CreateGroup(data.UserId, data.InvestigatorGroupName, data.HasGameAssignment, data.InstitutionId);

    }

存储库

   public void CreateGroup(string userId, string investigatorGroupName, bool hasGameAssignment, int institutionId)
    {
        using (var context = new GameDbContext())
        {
            var newGroup = new InvestigatorGroup()
            {
                InvestigatorGroupName = investigatorGroupName,
                HasGameAssignment = hasGameAssignment,
                InstitutionId = institutionId,
                IsTrashed = false
            };

            int institutionUserId =
                context.InstitutionUsers.Where(
                    iu => !iu.IsTrashed && iu.APUser.UserId == userId && iu.InstitutionId == institutionId).Select(iu => iu.InstitutionUserId).Single();

            var newGroupUser = new InvestigatorGroupUser()
            {
                InstitutionUserId = institutionUserId,
                InvestigatorGroup = newGroup,
                CreationDate = DateTime.Now
            };
            context.InvestigatorGroupUsers.Add(newGroupUser);

            context.SaveChanges();
        }
    }

1 个答案:

答案 0 :(得分:1)

你从一个错误的假设开始。

线......

int newGroupId = context.InvestigatorGroups.Add(newGroup).InvestigatorGroupId;

...将始终将0分配给newGroupIdAdd方法仅标记插入实体,但实际上并未插入实体。只有SaveChanges将数据写入数据库,而不是实体框架中的任何其他方法。

所以作业......

InvestigatorGroupId = newGroupId,

......也有问题。您必须将新InvestigatorGroup分配给InvestigatorGroupUser中的导航属性:

InvestigatorGroup = newGroup,

如果还没有,请将此导航属性添加到InvestigatorGroupUser

如果你有,那就足以执行这些行:

context.InvestigatorGroupUsers.Add(newGroupUser);
context.SaveChanges();

也不需要Add newGroup个对象,它将通过添加newGroupUser来添加。

因此,如果您这样做,您需要的唯一事务是SaveChanges默认在内部使用的事务。对于您显示的代码,您不需要TransactionScope。如果这是更大的WCF交易的一部分,那么故事可能会有所不同,但我认为至少你需要理解一些错误观念。