尝试在LINQ to SQL中插入根时插入现有的引用实体

时间:2011-09-08 14:20:22

标签: c# linq-to-sql transactions

我在LINQ to SQL中有两个模型。第一个是员工,第二个是职位。 我已经在位置表中插入了位置数据。 Employee模型将引用此数据。

Position {
    int id,   //auto increament
    string name,
    string description, 
}

Employee {
    int id,
    string name,
    Position position,
}

我想创建员工时的逻辑是:

  1. I Crate EmployeCreate并分配员工姓名和职位ID
  2. 使用位置信息库按ID查找位置。
  3. 创建员工模型从第二步分配已建立的职位模型
  4. 使用员工存储库插入员工并提交更改
  5. 我认为我的步骤是正确的,但是创建的位置再次插入到数据库中,通常由于数据已存在于数据库中而未插入。

    我的代码段服务如下:

    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;
            }
    }
    

1 个答案:

答案 0 :(得分:1)

除非您尝试跨多个上下文提交更改,否则不应在此处使用TransactionScope。 SubmitChanges在内部为请求创建一个事务,以覆盖作为submitchanges的一部分请求的多个插入/更新/删除操作。您需要显式管理上下文的唯一时间是您有多个被调用跨越的上下文/连接。

您看到的行为表明,当您将员工插入_employeeRepostiory时,可能会使用您正在使用的上下文之外的上下文来提取位置。