具有多个插入的WCF事务

时间:2016-02-02 16:06:40

标签: asp.net entity-framework wcf transactions transactionscope

创建用户时,多个表中都需要输入。我正在尝试创建一个事务,在一个表中创建一个新的条目,然后将新的entityid传递给父表,依此类推。我得到的错误是

  

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

我认为这是由在单个TransactionScope中创建多个连接引起的,但我不确定最佳/最有效的方法是什么。

    [OperationBehavior(TransactionScopeRequired = true)]
    public int CreateUser(CreateUserData createData)
    {

        // Create a new family group and get the ID
        var familyGroupId = createData.FamilyGroupId ?? CreateFamilyGroup();

        // Create the APUser and get the Id 
        var apUserId = CreateAPUser(createData.UserId, familyGroupId);

        // Create the institution user and get the Id
        var institutionUserId = CreateInsUser(apUserId, createData.AlternateId, createData.InstitutionId);

        // Create the investigator group user and return the Id
        return AddUserToGroup(createData.InvestigatorGroupId, institutionUserId);

    }

这是其中一个函数调用的示例,所有其他函数调用都遵循相同的格式

    public int CreateFamilyGroup(string familyGroupName)
    {
        var familyRepo = _FamilyRepo ?? new FamilyGroupRepository();
        var familyGroup = new FamilyGroup() {CreationDate = DateTime.Now};

        return familyRepo.AddFamilyGroup(familyGroup);

    }

存储库调用如下

public int AddFamilyGroup(FamilyGroup familyGroup)
        {
            using (var context = new GameDbContext())
            {
                var newGroup = context.FamilyGroups.Add(familyGroup);
                context.SaveChanges();
                return newGroup.FamilyGroupId;
            }
        }

1 个答案:

答案 0 :(得分:1)

  

我认为这是由在单个TransactionScope中创建多个连接引起的。

是的,这就是问题所在。只要你避免它,你如何避免它并不重要。常见的做法是每个WCF请求有一个连接和一个EF上下文。您需要找到一种方法来传递EF上下文。

方法AddFamilyGroup说明了EF的常见反模式:您使用EF作为CRUD工具。它更像是一个连接到数据库的实时对象图。整个WCF请求应共享相同的EF上下文。如果向这个方向移动,问题就会消失。