gpt4 book ai didi

wcf - DomainContext 中的冲突处理

转载 作者:行者123 更新时间:2023-12-01 13:01:29 25 4
gpt4 key购买 nike

我有一个 Linq-to-SQL RIA 服务和一个 silverlight 客户端。当 2 个人编辑同一个实体时,我在调用 SubmitChanges 时在 OnSubmitCompleted 中收到 EntityConflict。现在我想在不打扰用户的情况下对其使用react,我只想向他显示一个消息框并让他知道数据已被修改并且他的更改将被服务器值覆盖。

MyDomainContext.SubmitChanges(this.OnSubmitCompleted, invokeAfterSubmit);

private void OnSubmitCompleted(SubmitOperation so)
{
if (so.HasError)
{
if (so.EntitiesInError.Any(entity => entity.EntityConflict != null))
{
MessageBox.Show("Data has changed, entities will be reloaded....","Error", MessageBoxButton.OK);

// cache the entities, because the AcceptChanges() will clear them
var errorEntities = so.EntitiesInError.ToList();

// overwrite the local changes with the ones from the stoe
((IChangeTracking)Context.EntityContainer).AcceptChanges();

// reload the data
-> here comes the dirty code from below


// mark as handled as in "The User has been informed that all his stuff has been reverted"
so.MarkErrorAsHandled();
}
}

我不知道如何为这个特定实体重新加载数据。我什至不介意再次重新加载整个数据。

此刻我在做这个,感觉很脏:)

foreach (Entity entity in errorEntities)
{
var methodInfo = (from method in Context.GetType().GetMethods()
where method.Name.Contains("Query")
where method.Name.Contains(entity.GetType().Name)
select method);

foreach (var info in methodInfo)
{
// get the query from the Context to reload the entity
var result = (EntityQuery) info.Invoke(Context, null);

// load the entities
Context.Load(result, LoadBehavior.RefreshCurrent, null, null);
}

}

这可行,但我确信有更好的方法来解决冲突。 (合并当然很棒!)

请让我知道处理这种情况的更好方法:)

最佳答案

此冲突问题可以在服务器上解决。域服务是一个分部类,您可以在其中覆盖方法 ResolveConflicts

例子:

protected override bool ResolveConflicts(ChangeConflictCollection conflicts)
{
bool resolveChangeSetSuccess = true;

foreach (ObjectChangeConflict objectChangeConflict in conflicts)
{
foreach (MemberChangeConflict memberChangeConflict in objectChangeConflict.MemberConflicts)
{
if (memberChangeConflict.Member.Name == "Name of DB field")
{
memberChangeConflict.Resolve(RefreshMode.KeepCurrentValues);
}
else
{
memberChangeConflict.Resolve(RefreshMode.KeepChanges);
}
}

resolveChangeSetSuccess = resolveChangeSetSuccess && objectChangeConflict.IsResolved;
}

if (resolveChangeSetSuccess)
{
this.DataContext.SubmitChanges();
}

return resolveChangeSetSuccess;
}

关于wcf - DomainContext 中的冲突处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com