我正在尝试将一个条目添加到表中,并使用该添加条目的主键来创建另一个表的附加条目。
我得到的错误是
事务管理器已禁用其对远程/网络的支持 交易。 (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();
}
}
答案 0 :(得分:1)
你从一个错误的假设开始。
线......
int newGroupId = context.InvestigatorGroups.Add(newGroup).InvestigatorGroupId;
...将始终将0分配给newGroupId
。 Add
方法仅标记插入实体,但实际上并未插入实体。只有SaveChanges
将数据写入数据库,而不是实体框架中的任何其他方法。
所以作业......
InvestigatorGroupId = newGroupId,
......也有问题。您必须将新InvestigatorGroup
分配给InvestigatorGroupUser
中的导航属性:
InvestigatorGroup = newGroup,
如果还没有,请将此导航属性添加到InvestigatorGroupUser
。
如果你有,那就足以执行这些行:
context.InvestigatorGroupUsers.Add(newGroupUser);
context.SaveChanges();
也不需要Add
newGroup
个对象,它将通过添加newGroupUser
来添加。
因此,如果您这样做,您需要的唯一事务是SaveChanges
默认在内部使用的事务。对于您显示的代码,您不需要TransactionScope
。如果这是更大的WCF交易的一部分,那么故事可能会有所不同,但我认为至少你需要理解一些错误观念。