Generic Repository を作成しました。トランザクションで更新する必要があるエンティティが 2 つあります。これが私がしていることです..
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 のリポジトリを作成しています。これが Save Location のコードです。
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();
}
ここで私が間違っていることは何ですか。
ポインタをいただければ幸いです。