插入订单也会自动插入用户实体

时间:2010-07-12 21:51:41

标签: c# linq linq-to-sql insert

我尝试使用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的新手,如果您有任何想法,请赐教。感谢。

2 个答案:

答案 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行。

任何建议?感谢。