2010-07-12 41 views
0

我试图用现有用户使用LINQ插入订单行。该程序应只插入订单&订单明细,因为用户已经存在,我不想为每个订单添加新用户。插入订单也自动插入用户实体

取而代之,程序现在将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);中,数据库没有改变和没有顺序添加到数据库中。如果我添加该行,它会同时插入订单,订单细节和用户数据。

我对LINQ很新,请赐教,如果您有任何想法。谢谢。

+0

请不要丢弃这样的所有例外。如果你不能以有意义的方式处理异常,那么就不要抓住它。 – 2010-07-12 21:57:00

+0

实际上,我想捕获函数返回的布尔值,并在页面上显示相应的消息。但是为了清晰的代码,我现在删除了它们。 – TTCG 2010-07-12 22:01:53

+0

这可能与这些静态存储库类有关,以及您是如何(或不是*)管理您的L2S DataContext。我期望'User'和'Order'必须连接到同一个DataContext。它也可能与你在'User'类和表上定义身份的方式有关。这些细节隐藏在这里,所以我们不能肯定地说。 – Jay 2010-07-13 02:58:44

回答

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); 

User Entity的代码只有一行。但其他人大约有4或5行。

有什么建议吗?谢谢。

0

为什么datacontext插入用户?因为它认为用户不存在于数据库中。

此代码尝试显示用户在数据库中的datacontext。

u.orders.Add(o); 
db.orders.InsertOnSubmit(o); 
db.Refresh(RefreshMode.OverwriteCurrentValues, u); 
db.SubmitChanges(); 

还要检查,以确保用户在DBML定义主键,这就等于不覆盖。