使用EF更新Generic Repositories的问题

时间:2012-09-06 18:54:49

标签: entity-framework repository-pattern

我创建了Generic Repository,我需要在事务中更新两个实体。 这就是我在做什么..

ProductOrganizationEntity poDataContext= new ProductOrganizationEntity();
IRepository<tblProductInfo> productRepo = new GenericRepository<ProductOrganizationEntity, tblConfirmation>(poDataContext);

造成问题的代码就是这个。

 using (TransactionScope txScope = new TransactionScope())
 {
                    productRepo.Attach(productEntity);
                    productRepo.SaveChanges();
                    new ProductLocation().SaveLocation(productEntity.Locations, productEntity.productCode);
                    txScope.Complete();
 }

productRepo.SaveChanges(); 这是它抛出我的错误。错误是

The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "Venus" was unable to begin a distributed transaction.

(我们确实有服务器名为Venus,但在这些交易中根本无法访问。其次,正如我所说的那样,没有交易阻止)。

如果从Transaction Block中取出,这段代码可以正常工作。

ProductLocation.SaveLocation正在为Location创建Repository。以下是保存位置的代码。

IRepository<LocationInfo> locRepo= new GenericRepository<ProductOrganizationEntity, LocationInfo>(new ProductOrganizationEntity());

 if (loc.locID <= 0) // This is a new Location to be added.
      locRepo.Add(locEntity);
 else
     locRepo.Attach(siteToAdd);

 locRepo.SaveChanges();

以下是我在我的通用存储库中为这些方法做的事情

   public void Attach(TEntity entity)
    {
        if (entity == null)
            throw new ArgumentException("Update : Supplied Entity is Null.");

        _currentDbSet.Add(entity);
        System.Data.Entity.Infrastructure.DbEntityEntry entry = _dataContext.Entry(entity);
        entry.State = System.Data.EntityState.Modified;
    }

这就是我在通用仓库中的SaveChanges中所拥有的。

 public virtual void SaveChanges()
    {
        if (_dataContext == null)
            throw new Exception("SaveChanges: DataContext is not initialized.");

        _dataContext.SaveChanges();
    }

我在这里做错了什么。

我很欣赏任何指示。

1 个答案:

答案 0 :(得分:1)

您的服务器可能链接到数据库级别的另一个SQL服务器。

或许看看这个:http://msdn.microsoft.com/en-us/library/ms188279.aspx

必须承认我从未使用过链接服务器(至少还没有),但在错误中看到“链接服务器”让我想到了这一点。