更改存储库中的相关数据

时间:2015-05-19 12:19:13

标签: c# asp.net-mvc entity-framework inversion-of-control

有2个实体Order和OrderDetail,它们以这种方式绑定:

public partial class Order
{ 
    public Order()
    { 
        OrderDetails = new List<OrderDetail>();
    }
    ...
}
public class OrderDetail
{
    public long OrderDetailId { get; set; }
    public int OrderId { get; set; }

    [DefaultValue(0)]
    public int RowNumber { get; set; }
    [ForeignKey("Product")]
    public int ProductId { get; set; }
    public int Count { get; set; }
    public decimal Price { get; set; }
    [ForeignKey("ProductId")]
    public virtual Product Product { get; set; }
    public virtual Order Order { get; set; }
}

我需要更改订单并从服务订单中删除一些细节。我在此服务中仅注入IRepository<Order>(不是IRepository<OrderDetail>)。
问题是:我是否只能通过IRepository<Order>(明确IRepository<OrderDetail>DbContext)来执行此操作。

=========根据评论实施IRepository ==========

public class EFRepository<T> : IRepository<T> where T : class { 
    private readonly DBContext _context; 
    public EFRepository() { 
        _context = new DBContext(); 
    } 
    public T Add(T item) { 
        _context.Set<T>().Add(item); 
        _context.SaveChanges(); return item; 
    } 
    public T Update(T entity) { 
        _context.Entry(entity).State = EntityState.Modified;
        _context.SaveChanges(); 
        return entity; 
    }
    public void Delete(T item) { 
       if (item!=null) _context.Set<T>().Remove(item); 
       _context.SaveChanges(); 
    } 
    public T GetById(object id) { 
        return _context.Set<T>().Find(id); 
    }
    public IQueryable<T> GetAll(Expression<Func<T, bool>> predicate = null) { 
        return (predicate == null) ? _context.Set<T>() : _context.Set<T>().Where(predicate); 
    } 

1 个答案:

答案 0 :(得分:0)

解决方案是实体OrderDetails中的一个关键,(删除OrderDetailId并将OrderId&amp; RowNumber设置为主要复合键(感谢一名男子暗示,但他的帖子被主持人删除)

public class OrderDetail
    {
      //  public long OrderDetailId { get; set; }

         [Key, Column(Order = 1)]
        public int OrderId { get; set; }

        [Key, Column(Order = 2)]
        public int RowNumber { get; set; }

        [ForeignKey("Product")]
        public int ProductId { get; set; }
        public int Count { get; set; }
        public decimal Price { get; set; }
        [ForeignKey("ProductId")]
        public virtual Product Product { get; set; }
        public virtual Order Order { get; set; }

    }

以下代码更改数据并删除不必要的OrderDetails

 public Order ChangeOrderSimple(Guid guid, IEnumerable<JsonModelItem> items, string Comments, bool isReserve, DateTime? DeliveryDate = null)
        {
            decimal total = 0;
            int row = 1;
            Dictionary<int, int> codes = items.ToDictionary(p => p.ProductId,p=>p.Count);
            var OrderToChange = _orders.GetAll(q => q.GuidIn1S == guid).Include(o => o.OrderDetails).FirstOrDefault();
            OrderToChange.Comments = Comments;
            OrderToChange.isReserve = isReserve;
            OrderToChange.DeliveryDate = DeliveryDate;


            var OrderDetails = OrderToChange.OrderDetails.ToList();

            List<OrderDetail> OrderDetailsChanged = new List<OrderDetail>();

            for (int i = 0; i < OrderDetails.Count; i++)
            {
                var item = OrderDetails[i];
                //    item = OrderD.OrderDetails[i];
                var result = codes.ContainsKey(item.ProductId);


                if (result)
                {
                    OrderDetail detail = new OrderDetail
                    {
                        RowNumber = ++row,
                        ProductId = item.ProductId,
                        Count = codes[item.ProductId],
                        Price = item.Price,
                        OrderId = item.OrderId
                    };
                    OrderDetailsChanged.Add(detail);
                }
            }

            OrderToChange.OrderDetails = OrderDetailsChanged;
            OrderToChange.CalculateTotal();

            _orders.Update(OrderToChange);
            return OrderToChange;
        }