Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 获得;此EntitySet中已存在具有相同标识的实体;但是EntitySet是空的_Silverlight_Silverlight 4.0_Wcf Ria Services - Fatal编程技术网

Silverlight 获得;此EntitySet中已存在具有相同标识的实体;但是EntitySet是空的

Silverlight 获得;此EntitySet中已存在具有相同标识的实体;但是EntitySet是空的,silverlight,silverlight-4.0,wcf-ria-services,Silverlight,Silverlight 4.0,Wcf Ria Services,当我尝试向EntitySet添加新项时,出现以下异常: 具有相同身份的实体 此EntitySet中已存在 但是,当我检查EntitySet时,它的计数为0 知道当集合为空时为什么会出现此错误吗?如果集合中没有项目,那么集合中怎么可能已经存在实体 更新 我把范围缩小了一点。只有当我将项目添加到集合中,删除它,然后重新添加它时,才会发生这种情况。即使该项不再在EntitySet中,它仍会以某种方式记住它。我需要做什么才能让它忘记 更新:这里是一些涉及到的类和逻辑的代码片段 服务器实体: public

当我尝试向EntitySet添加新项时,出现以下异常:

具有相同身份的实体 此EntitySet中已存在

但是,当我检查EntitySet时,它的计数为0

知道当集合为空时为什么会出现此错误吗?如果集合中没有项目,那么集合中怎么可能已经存在实体

更新

我把范围缩小了一点。只有当我将项目添加到集合中,删除它,然后重新添加它时,才会发生这种情况。即使该项不再在EntitySet中,它仍会以某种方式记住它。我需要做什么才能让它忘记

更新:这里是一些涉及到的类和逻辑的代码片段

服务器实体:

public class PhotoDto
{
    [Key]
    [Editable(false)]
    public int Id { get; set; }

    /* clip */

    [Include]
    [Association("Photo_Destination", "Id", "PhotoId")]
    public EntitySet<PhotoDestinationDto> Destinations { get; set; }
}

public class PhotoDestinationDto : BaseDestionationDto
{
    [Key]
    [Editable(false, AllowInitialValue = true)]
    public int PhotoId { get; set; }

    [Key]
    [Editable(false, AllowInitialValue = true)]
    public bool IsAnnotated { get; set; }

    [Key]
    [Editable(false, AllowInitialValue = true)]
    public int DropZoneId { get; set; }
}

public class BaseDestinationDto
{
    [Key]
    [Editable(false, AllowInitialValue = true)]
    public Guid DatabaseUid { get; set; }

    [Key]
    [Editable(false, AllowInitialValue = true)]
    public string Unit { get; set; }

    [Key]
    [Editable(false, AllowInitialValue = true)]
    public string EqCircId { get; set; }

    [Key]
    [Editable(false, AllowInitialValue = true)]
    public string EqType { get; set; }
}
要添加照片目标客户端,请执行以下操作:

PhotoDto photo = GetPhotoDto();
PhotoDestinationDto destToRemove = photo.Destinations.First(x => x.DropZoneId == 1);
photo.Destinations.Remove(destToRemove);
var dest = new PhotoDestinationDto
{
    DropZoneId = zoneId,
    EqCircId = selectedEqCircId,
    EqType = selectedEqType,
    Unit = selectedUnit,
    PhotoId = id,
    DatabaseUid = selectedDatabaseId
};

p.Destinations.Add(dest); // this is where exception is thrown. p.Destinations.Count is 0 here.

您是否已确保在该表的db中正确定义了PK/标识,并将其反映在您的模型中?请尝试覆盖DomainService中的OnError,以获取有关服务器端异常的更多信息。(您在客户端/Silverlight端遇到此错误,对吗?

好的,在看到您的代码后,我看到了问题所在。当从EntityCollection中删除实体时,实体实际上并没有被删除(如在挂起的删除中)-关联仅被切断,FKs设置为其默认值。因此,photo.Destinations.Remove()调用实际上不会从DomainContext(ctxt.photoDestinationTos EntitySet)中删除实体。这就是为什么会发生缓存冲突


要实际删除它,您应该调用ctxt.PhotoDestinationDtos.remove。

按代码Juding
Unit=selectedUnit
p.Destinations.Add(dest)
和您描述的其他症状似乎与您的情况完全相同。我下面的发现为我解决了这个问题

如果因此导致数据库中出现任何重复的实体,您也会对此感兴趣。我将以前保存的行神奇地变成
新的
,然后变成重复记录。下面这个简单的更改再次修复了它


我发现,如果在将父实体添加到其实体集中之前创建实体并立即为其分配外键关系,则可能会出现此错误的竞争条件

事实证明,设置外键关系的行为实际上会将实体添加到其相应的实体集中,但有时会导致竞争条件,特别是当您的UI正在加载、保存和清除实体集时

坏:

var todo = new TODO();
todo.Status = TODOContext.Statuses.Single(x=>x.Status == "Unknown");
todo.AssignedTo = TODOContext.Users.Single(x=>x.UserName == "JSMITH");
TODOContext.TODOs.Add(todo); // adding entity after setting FK
var todo = new TODO();
TODOContext.TODOs.Add(todo); // add entity before setting FK
todo.Status = TODOContext.Statuses.Single(x=>x.Status == "Unknown");
todo.AssignedTo = TODOContext.Users.Single(x=>x.UserName == "JSMITH");
好:

var todo = new TODO();
todo.Status = TODOContext.Statuses.Single(x=>x.Status == "Unknown");
todo.AssignedTo = TODOContext.Users.Single(x=>x.UserName == "JSMITH");
TODOContext.TODOs.Add(todo); // adding entity after setting FK
var todo = new TODO();
TODOContext.TODOs.Add(todo); // add entity before setting FK
todo.Status = TODOContext.Statuses.Single(x=>x.Status == "Unknown");
todo.AssignedTo = TODOContext.Users.Single(x=>x.UserName == "JSMITH");

我也遇到了同样的问题,后来我意识到数据库中有一行的ID列为“0”,每次我们试图保存新记录时,它会在ID列中插入0,我删除了已经存在的记录,我的代码运行得非常好,
我没有更改由DomainService类创建的Inser方法,

任何仍然出现此错误的人,在尝试上述修复之后,我仍然出现了错误。最后,我可以通过为我的标识id分配一个新的唯一id来修复此问题,即使该id不会在数据库中更新。

从EntitySet中删除实体时,应在SubmitChanges()期间删除数据库中的关联记录。因此,该实体必须继续跟踪该实体,即使该实体已被删除。它是生成delete语句所必需的

尽管该实体不再直接在EntitySet(下图中的结果视图节点)中可用,但在private _IdentityCache属性中跟踪该实体。在下面的示例中,EntitySet中只有一个实体

…但是_identityCache属性中有两项

您可以使用以下代码访问EntityState为Deleted的EntitySet跟踪的实体

entitySet.EntityContainer.GetChanges().RemovedEntities

在您的情况下,您应该从上面重用RemovedEntities集合中的现有实体,或者在添加具有相同键的新实体之前将其分离。

暗中拍摄:实体集是否缺少KeyAttribute?我在实际EntitySet属性上有[Association]属性。EntitySet中的T类型也具有具有[Key]属性的属性。我使用自己的DTO对象(不是EF或Linq2Sql生成的对象)。我确实在DTO对象中定义了[Key]属性。在将新项添加到EntitySet的代码行中,我得到了错误客户端。(EntitySet.Add()。我将尝试覆盖域服务中的OnError,看看它告诉了我什么,但是因为Add()方法不与服务器通信(直到调用SaveChanges(),此时还没有调用它)我不相信这会泄露任何信息。我在域服务中覆盖了OnError方法,但没有为此错误调用它。必须都是客户端的。这是有道理的,但是我没有ctx.photoDestinationTos属性。我能想到的最好的办法是,因为我的域服务上没有任何方法来获取照片列表,当你获取照片列表时,它们就会出现。