Linq To Sql ORM更新一对多



我正在努力使用Linq到sql-Orm同时更新多条记录。我制作的数据库如下:一次招标有一个或多个细节。一个TenderingDetails有一个或多个DetailsOptions。一个选项具有一个或多个ConfigDetail。

我能够创建那些通常使用Linq to Sql的。

但当我尝试更新时,我最终会有多个记录。我为上述每个实体都有一个模型类,然后我将其传递给更新Tindering、TinderingDetails、DetailsOptions和OptionConfigDetails 的enity的服务

然后当我尝试更新如下:

the parameters are :
TenderingModel tenderingModel,
TenderingDetailsModel tenderingDetailModel,
List<TenderingOption> optionsList
try
{
var entity = ModelMapper.GetTenderingEntity(TenderingModel);
//The next statement is where i got form dataconetxt ->singleordefault 
//then map the properties one by one
_unitOfWork.TenderingRepository.Update(entity);
var tenderingDetailEntity = ModelMapper.GetTenderingDetailEntity(tenderingDetailModel)
_unitOfWork.TenderingDetailsRepository.Update(tenderingDetailEntity);
//Update Options
if (optionsList != null)
{
var optionsEntities = new List<OptionItem>();
optionsList.ForEach(o =>
{
//Just get the Entity from the model
optionsEntities.Add(o.GetEntity());
});
foreach (var item in optionsEntities)
{
item.ID_Tendering_DETAILS = pricingDetailEntity.ID_Tendering_DETAILS;
//Delete the exisiting and config details

//delete all configuration details
_unitOfWork.OptionConfigurationsRepository.DeleteAllByOptionId(item.ID_OPTION);

//Add the new  Config Details

item.OptionConfigurationDetails.ToList().ForEach(od =>
{
_unitOfWork.OptionConfigurationsRepository.Create(od);
});
_unitOfWork.OptionsRepository.Update(item);
}
}
//this mainly would submitChanges()
_unitOfWork.Commit();
}
catch (Exception e)
{
throw new Exception($"Error while Updating  the Tendering, details are : {e.Message}");
}

我所期望的是我将更新如下:

TenderingDetail实体将由来自模型的值更新,作为投标细节的子项的选项将通过删除其所有配置细节来更新,然后在更新"选项"表本身的同时添加新选项但我会得到的是选项和详细信息的添加记录,而不是更新???

编辑:

我使用的更新方法似乎有问题,但我不知道它到底是什么:例如,投标表格有以下几列:

Id -> Primary Key
ClientId-> FK
Current Revision -> int value, nullable
some other column values that are having default values , like time stamps , and etc,

我如何进行更新,比如:

public void Update(Tendering tendering)
{
var tenderingEntity =  GetTendering ById(pricing.ID_Tendering);
tenderingEntity .CURRENT_REVISION = tendering.CURRENT_REVISION;
tenderingEntity .ID_CLIENT = tendering.ID_CLIENT;               
}

根据提供的代码,我不确定这里有什么_unitOfWork,也不确定您是如何处理数据库上下文的。通常,当保存重复的记录时,当使用不同的上下文来保存父项和子项,或者该项是从您试图保存的上下文以外的上下文中提取的时,就会发生这种情况。仔细检查存储库和工作单元的实现,以确保它们在操作结束时发出单个Save,并且所有值都由同一上下文实例获取和保存。

顺便说一句,你的_UnitOfWork感觉更像是一个活跃的记录模式,而不是一个真正的工作单元。

最新更新