如果已存在,请不要让用户添加元素(即使标记为setDeleted)

时间:2013-08-25 13:26:47

标签: breeze durandal

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

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

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

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

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

我的问题:以下情况存在问题:

  • 删除了元素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);

感谢。

1 个答案:

答案 0 :(得分:0)

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

var transports = transport().linkedTransports();
for (var i = transports.length; i-- >= 0){
    if (transports[i].RelatedTransportId() == transpRelatedId) {
        alert('Already present!');
        return false;
    }
}

var deleted = manager.getEntities(transportType, breeze.EntityState.Deleted);
for (i = deleted.length; i-- >= 0){
    if (deleted[i].id() == transpRelatedId) {
        alert('Was deleted!');
        return false;
    }
}