我在LINQ to SQL中有两个模型。第一个是员工,第二个是职位。 我已经在位置表中插入了位置数据。 Employee模型将引用此数据。
Position {
int id, //auto increament
string name,
string description,
}
Employee {
int id,
string name,
Position position,
}
我想创建员工时的逻辑是:
我认为我的步骤是正确的,但是创建的位置再次插入到数据库中,通常由于数据已存在于数据库中而未插入。
我的代码段服务如下:
EmployeService {
//property and constructor
AddEmployee(EmployeeCreate command) {
var employee = EmployeeFactory.Create(command);
var possition = _positionRepository.GetById(command.possitionId);
using (var tx = new TransactionScope())
{
employee.Position = possition;
_employeeRepository.InsertOnSubmit(employee);
_employeeRepository.SubmitChanges();
tx.Complete();
}
}
}
修改 我创建了通用的Linq存储库。 Employee和Position扩展了通用Linq存储库。
public class LinqRepository<T> : IRepository<T>, IRepository where T : class
{
protected readonly DataContext _dataContext;
public LinqRepository(IDataContextProvider dataContextProvider)
{
_dataContext = dataContextProvider.DataContext;
}
}
答案 0 :(得分:1)
除非您尝试跨多个上下文提交更改,否则不应在此处使用TransactionScope。 SubmitChanges在内部为请求创建一个事务,以覆盖作为submitchanges的一部分请求的多个插入/更新/删除操作。您需要显式管理上下文的唯一时间是您有多个被调用跨越的上下文/连接。
您看到的行为表明,当您将员工插入_employeeRepostiory时,可能会使用您正在使用的上下文之外的上下文来提取位置。