Порядок вставки автоматически вставляет пользовательский объект также - PullRequest
0 голосов
/ 13 июля 2010

Я попытался вставить строку заказа с существующим пользователем, используя LINQ.Программа должна только вставлять детали заказа и заказа, потому что пользователь уже существует, и я не хочу добавлять нового пользователя для каждого заказа.

Вместо этого программа теперь вставляет Order, OrderDetails вместе с пользователем.Итак, я получаю дубликатов пользователей в своей таблице пользователей.

Я перебираю элементы карт, создаю строки 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);

Ниже показано, как я добавляю Orders

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 и, пожалуйста, сообщите мне, если у вас есть идеи.Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 июля 2010

Проблема из-за разного 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 голосов
/ 13 июля 2010

Почему datacontext вставляет пользователя? Потому что он думает, что пользователь не существует в базе данных.

Этот код пытается показать datacontext, что пользователь находится в базе данных.

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

Также проверьте, чтобы убедиться, что у пользователя есть первичный ключ, определенный в dbml, и его значение равно не переопределено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...