我尝试使用LINQ向现有用户插入Order Row。该程序应该只插入订单&订单明细,因为用户已经存在,我不想为每个订单添加新用户。
而不是这样,程序现在将Order,OrderDetails与User一起插入。所以,我在用户表中获得了重复的用户。
我迭代了cartitems并创建了orderdetails行并将它们添加到Order表中。
order o = new order() { orderDate = DateTime.Today};
foreach (CartItem ci in items)
{
orderdetail od = new orderdetail() { itemId = ci.ItemId, itemType = char.Parse(ci.ItemType), price = int.Parse(ci.Price.ToString()) };
o.orderdetails.Add(od);
}
user u = Users.GetUserByUserId(int.Parse(Session["userId"].ToString()));
Orders.AddOrder(o, u);
以下是我添加订单的方式
public static Boolean AddOrder(order o, user u)
{
try
{
u.orders.Add(o);
db.orders.InsertOnSubmit(o);
db.SubmitChanges();
return true;
}
catch
{
return false;
}
}
如果删除db.orders.InsertOnSubmit(o);,则数据库没有更改,也没有向数据库添加顺序。如果我添加该行,它会同时插入order,orderdetails和用户数据。
我是LINQ的新手,如果您有任何想法,请赐教。感谢。
答案 0 :(得分:0)
为什么datacontext会插入用户?因为它认为用户不存在于数据库中。
此代码尝试显示用户在数据库中的datacontext。
u.orders.Add(o);
db.orders.InsertOnSubmit(o);
db.Refresh(RefreshMode.OverwriteCurrentValues, u);
db.SubmitChanges();
还要检查以确保用户在dbml中定义了主键,并且不会覆盖equals。
答案 1 :(得分:0)
问题是由于DataContext(db)的不同而我在AddOrder下移动了获取用户代码。因此,用户和订单都在同一个DataContext下,现在可以。
public static Boolean AddOrder(order o, int userId)
{
try
{
user u = db.users.Single(us => us.userId == userId);
u.orders.Add(o);
db.SubmitChanges();
return true;
}
catch
{
return false;
}
}
但另一个问题是......我想把代码用于获取用户,订单,产品等实体,以减少代码的冗余。我不想在每种方法下一次又一次地放置所有东西。
我怎么能实现?
我不想在我想要获取用户实体的每个地方编写以下代码。
user u = db.users.Single(us => us.userId == userId);
用户实体的代码只有一行。但其他人约有4或5行。
任何建议?感谢。