当我们在客户端工作并在Asp.net MVC中将其发送到服务器端时,如何查找在列表中修改了哪些项目

时间:2013-05-24 06:12:30

标签: asp.net-mvc entity-framework collections soa

我正在研究基于SOA的项目,我得到的情况是我将整个对象数组发送到服务器,然后我必须看到哪些对象是新的,哪些是我必须更新的,因此我是寻找一些通用函数,它可以让我获得更新,删除或插入属性的列表

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,我发送了具有多个子实体的实体。挑战在于弄清楚哪些子实体已被更新,添加或删除。这就是我做的。

  1. 使用IObjectWithState实施ChildEntity。 (灵感来自多个实体框架视频之一)
  2. 拉出实体的服务器端版本。
  3. 调用FindDifference以获取客户端和服务器上的子实体的区别
  4. IList<ClassTicket> clientSideTickets = /// What received from client
    IList<ClassTicket> serverSideTickets = /// What received from database
    
    
      var diffTickets = FindDifference(clientSideTickets ,serverSideTickets ,
        (ticket1, ticket2) => ticket1.Id == ticket2.Id,(ticket1, ticket2) => ticket1.Name == ticket2.Name && ticket1.NoOfTicketsAvailable == ticket2.NoOfTicketsAvailable && ticket1.Price == ticket2.Price);
    
    public interface IObjectWithState
    {
        State State { get; set; }
    }
    
    
    // My Child Entity
    public class ClassTicket: IObjectWithState
      {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public short NoOfTicketsAvailable { get; set; }
        public State State { get; set; }
    }
    
    
    public static IEnumerable<T> FindDifference<T>(IEnumerable<T> clientList, IEnumerable<T> serverList, Func<T, T, bool> identityDetector, Func<T, T, bool> changeDetector) where T : IObjectWithState
    {
        var finalList = new List<T>();
        var clientItems = clientList as T[] ?? clientList.ToArray();
        var serverItems = serverList as T[] ?? serverList.ToArray();
        foreach (var clientItem in clientItems)
        {
            bool foundInServerList = false;
            foreach (var serverItem in serverItems)
            {
                if(identityDetector(clientItem, serverItem))
                {
                    foundInServerList = true;
                    clientItem.State = !changeDetector(clientItem, serverItem) ? State.Modified : State.Unchanged;
                    finalList.Add(clientItem);
                    break;
                }
            }
                if(!foundInServerList)
                {
                    clientItem.State = State.Added;
                    finalList.Add(clientItem);
                }
            }
    
    
    foreach (var serverItem in serverItems)
    {
        var foundInClientList = clientItems.Any(clientItem => identityDetector(serverItem, clientItem));
        if (!foundInClientList)
        {
            serverItem.State = State.Deleted;
            finalList.Add(serverItem);
        }
    }
        return finalList;
    }