有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);
}
答案 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;
}