C# 更改存储库中的相关数据
有两个实体Order和OrderDetail,它们以这种方式绑定:C# 更改存储库中的相关数据,c#,asp.net-mvc,entity-framework,inversion-of-control,C#,Asp.net Mvc,Entity Framework,Inversion Of Control,有两个实体Order和OrderDetail,它们以这种方式绑定: public partial class Order { public Order() { OrderDetails = new List<OrderDetail>(); } ... } public class OrderDetail { public long OrderDetailId { get; set; } public int Orde
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; }
}
该解决方案是实体OrderDetails中的一个键,(删除OrderDetailId并将OrderId和RowNumber设置为主复合键(感谢一名男子暗示,但他的帖子已被主持人删除) 而不是执行以下代码更改数据和删除不必要的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;
}
公共订单ChangeOrderSimple(Guid、IEnumerable项、字符串注释、bool isReserve、DateTime?DeliveryDate=null)
{
小数总数=0;
int行=1;
字典代码=items.ToDictionary(p=>p.ProductId,p=>p.Count);
var OrderToChange=\u orders.GetAll(q=>q.GuidIn1S==guid).Include(o=>o.OrderDetails.FirstOrDefault();
OrderToChange.Comments=注释;
OrderToChange.isReserve=isReserve;
OrderToChange.DeliveryDate=交货日期;
var OrderDetails=OrderToChange.OrderDetails.ToList();
List OrderDetailsChanged=新列表();
for(int i=0;iIRepository
的实现。您的意思是在T上没有更多的条件,或者没有更多的方法签名,比如RemoveChild(Int32 childRank)
?我的意思是从存储库中获取和更新订单(及其订单详细信息),然后将其放入数据库(没有直接到DbContext的地址)var OrderToChange=_orders.GetAll(-);List orderDetails=new List();int row_num=0;foreach(代码中的KeyValuePair对){row_num++;orderDetails.Add(new orderDetails{ProductId=pair.Key,Count=pair.Value,Price=100,rownumer=row_num,OrderId=OrderToChange.OrderId});}OrderToChange.OrderDetails=OrderDetails;_orders.Update(OrderToChange);
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; }
}
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;
}