我正在使用一个自定义库,它为我生成 DAL,类似于实体框架,但不完全相同,并且在使用 RIA 强加的它时遇到问题。我的问题是自定义 DAL 生成一个 IsPersisted 属性,该属性本质上标识实体是否具有相应的数据库记录。删除代码的关键部分看起来像......
if(this.IsPersisted)
dataAccessor.Delete();
else
throw new NotSupportedException("Delete not supported on unpersisted entities.");
当我使用 RIA 在客户端和服务器之间生成介质时,问题就出现了。我有一个具有子组合属性的父类,例如
class Parent{
...
[Include,Association("Parent_Child","ParentId","ParentId",IsForeignKey=false), Composition]
public List<Child> Children{get{return (_children = _children??new List<Child>());}}
}
在客户端代码中,如果我随后使用parent.Children.Remove(child);
正确的实体操作将中继到服务器,但是IsPersisted
当生成更改集时标志将更改为 false,这反过来会导致NotSupportedException
.
我做了很多挖掘和探索。在检查返回服务器的实际网络流量后,我发现发送到服务器的 ChangeSet 实际上包含该缺陷。它正确地公开了原始实体和值,但是在变更集的 Delete 段中,我可以看到再次指定为 OriginalEntity 的相同实体(由相同身份验证),但这次除了 ID 之外所有值都是空的。
如果我跟踪 ChangeSet 的反序列化,我可以看到它实际上创建了两个独立的 Child 实例,首先正确填充,然后再次归零。然后,ChangeSet 仅保存子项的归零版本。
关于如何修复 RIA 发送的任何想法?