0

我在我的 asp.net 项目中使用 Breeze。

我有一个实体(传输),其中包含另一个实体(linkedTransports)。

我有一个页面,允许用户为我的 Transport 添加/删除一些linkedTransports。当用户单击特定linkedTransport 的删除按钮时,它被标记为已删除,但只有在调用时才会真正删除datacontext.saveChanges();。用户仍然可以点击取消然后我打电话datacontext.cancelChanges()

每个linkedTransport 必须是唯一的。我的意思是我不能将元素 123 添加两次。

每次用户尝试添加linkedTransport 时,我都会遍历所有linkedTransport 并检查它是否不存在。对于大多数情况,它工作得很好。

我的问题:以下情况有问题:

  • 删除元素 123
  • (直到 saveChanges 才提交删除)
  • 添加元素 123

因为元素被删除(实际上是 setDeleted 但未提交服务器端)我没有检测到他的存在客户端然后添加错误,因为密钥已经存在。

我希望你明白我的意思。

知道如何在允许用户添加之前遍历所有linkedTransports(甚至已删除)以检查它是否已经存在?

这是我的课程:

public class Transport
{
    [Key]
    public int Id { get; set; }
    ...
    public virtual List<LinkedTransport> LinkedTransports { get; set; }
}

public class LinkedTransport
{
    [Key, Column(Order = 0)]
    public int TransportId { get; set; }
    [Key, Column(Order = 1)]
    public int TransportRelatedId { get; set; }

    public virtual Transport Transport { get; set; }
    public virtual Transport TransportRelated { get; set; }
}

到目前为止,这是我检查元素是否已经存在的方法:

// don't accept if selected element is already present
for (var i = transport().linkedTransports().length - 1; i >= 0 ; i--) {
    if (transport().linkedTransports()[i].transportRelatedId() == transpRelatedId) {
        alert('Already present!');
        return false;
    }
};

// if we go so far then we can create the linkedTransport safely
ctxTransport.createLinkedTransport(transpId, transpRelatedId, transpNumber);

谢谢。

4

1 回答 1

0

我认为我可以用删除的传输来补充搜索列表,例如,

var transports = transport().linkedTransports();
for (var i = transports.length; i-- >= 0){
    if (transsports[i].RelatedTransportId() == transpRelatedId) {
        alert('已经存在!');
        返回假;
    }
}

var 已删除 = manager.getEntities(transportType,breath.EntityState.Deleted);
for (i = deleted.length; i-- >= 0){
    if (deleted[i].id() == transpRelatedId) {
        alert('已删除!');
        返回假;
    }
}
于 2013-08-28T19:40:47.630 回答