Добавление новой строки со ссылочными типами в Entity Framework - PullRequest
0 голосов
/ 12 апреля 2009

Я работаю с Entity Framework только несколько недель. Это здорово, но как правильно добавить новую строку со ссылочными подпунктами (таблицами)?

я пробовал эту процедуру

CMS.ShopOrder order = new CMS.ShopOrder();

    order.CreatedOn = DateTime.Now;

    foreach (var item in CMS.CurrentSession.Cart.Items)
    {           
        order.ShopOrderItems.Add(item);
    }

    db.AddToShopOrder(order);       

    int selT = FormatHelper.GetInt32(ddTransport.SelectedValue);
    int selP = FormatHelper.GetInt32(ddTransport.SelectedValue);    

    order.Transportation = db.Transportation.Where(t => t.Id == selT).FirstOrDefault();
    order.Payment = db.Payment.Where(p => p.Id == selP).FirstOrDefault();
    order.Customer = db.Customer.Where(c=>c.Id == CMS.CurrentSession.Customer.Id).FirstOrDefault();

    db.SaveChanges();

но я получил ошибку:

На объектный объект нельзя ссылаться несколькими экземплярами IEntityChangeTracker. Строка 492: base.AddObject ("ShopOrder", shopOrder);

Могу ли я добавить все эти записи одновременно?

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 12 апреля 2009

Кажется, у вас проблема с обработкой контекста вашего объекта. Ошибка указывает, что объект уже связан с контекстом объекта, когда вы пытаетесь добавить его. Я предполагаю, что вы поддерживаете некоторые объекты при выполнении нескольких веб-запросов, но вы создаете новый объектный контекст для каждого веб-запроса. Вы должны отсоединить сущности от старого контекста и присоединить их к новому, чтобы это работало.

См. MSDN для аналогичной проблемы.

0 голосов
/ 13 апреля 2009

Спасибо, Данбрук,

Проблема была в том, что я не отсоединял объект от entityContext, когда добавлял его в сеанс.

Это работает:

public CMS.ProductVariant GetProductVariantById(int id)
    {
        ProductVariant pv = null;
        if (id > 0)
        {
            using (db = new CmsEntity())
            {
                pv = db.ProductVariant.Where(v => v.Id == id).FirstOrDefault();
                db.Detach(pv); 
            }
        }
        return pv;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...