具有多个插入的 WCF 事务
WCF Transaction with multiple inserts
创建用户时,需要输入多个table。我正在尝试创建一个事务,该事务在一个 table 中创建一个新条目,然后将新的 entityid 传递给父 table 等等。我得到的错误是
The transaction manager has disabled its support for remote/network
transactions. (Exception from HRESULT: 0x8004D024)
我认为这是由于在单个 TransactionScope 中创建多个连接造成的,但我不确定 best/most 执行此操作的有效方法是什么。
[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;
}
}
I believe this is caused by creating multiple connections within a single TransactionScope
是的,这就是问题所在。只要你避免它,你如何避免它并不重要。一件常见的事情是每个 WCF 请求有一个连接和一个 EF 上下文。您需要找到一种方法来传递该 EF 上下文。
方法 AddFamilyGroup
说明了 EF 的常见反模式:您将 EF 用作 CRUD 工具。它对我来说更像是一个连接到数据库的实时对象图。整个 WCF 请求应该共享相同的 EF 上下文。如果你朝那个方向移动,问题就会消失。
创建用户时,需要输入多个table。我正在尝试创建一个事务,该事务在一个 table 中创建一个新条目,然后将新的 entityid 传递给父 table 等等。我得到的错误是
The transaction manager has disabled its support for remote/network transactions. (Exception from HRESULT: 0x8004D024)
我认为这是由于在单个 TransactionScope 中创建多个连接造成的,但我不确定 best/most 执行此操作的有效方法是什么。
[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;
}
}
I believe this is caused by creating multiple connections within a single TransactionScope
是的,这就是问题所在。只要你避免它,你如何避免它并不重要。一件常见的事情是每个 WCF 请求有一个连接和一个 EF 上下文。您需要找到一种方法来传递该 EF 上下文。
方法 AddFamilyGroup
说明了 EF 的常见反模式:您将 EF 用作 CRUD 工具。它对我来说更像是一个连接到数据库的实时对象图。整个 WCF 请求应该共享相同的 EF 上下文。如果你朝那个方向移动,问题就会消失。