DLINQ - объекты вставляются без .InsertOnSubmit ()?

Я столкнулся с интересной проблемой при использовании DLINQ. Когда я создаю экземпляр объекта, вызов .SubmitChanges () в DataContext вставит новую строку в базу данных - без вызова .Insert [All] OnSubmit (...).

//Code sample:
Data.NetServices _netServices = new Data.NetServices(_connString);

Data.ProductOption[] test = new Data.ProductOption[]
{
        new Data.ProductOption
        {
             Name="TEST1", 
             //Notice the assignment here
             ProductOptionCategory=_netServices.ProductOptionCategory.First(poc => poc.Name == "laminate")
        }
};

    _netServices.SubmitChanges();

Выполнение приведенного выше кода вставит новую строку в базу данных. Я заметил этот эффект при написании приложения для анализа XML-файла и заполнения некоторых таблиц. Я заметил, что было более 1000 вставок, когда я ожидал около 50 или около того, - тогда я, наконец, изолировал это поведение.

Как я могу предотвратить неявное сохранение этих объектов?

Спасибо, Чарльз


person Charles    schedule 22.12.2008    source источник
comment
Изменение следующей строки ProductOptionCategory = _netServices.ProductOptionCategory.First (poc = ›poc.Name == ламинат) на ProductOptionCategoryID = _netServices.ProductOptionCategory.First (poc =› poc.Name == ламинат) .ID Кажется, чтобы исправить это. Кто-нибудь знает другой способ?   -  person Charles    schedule 23.12.2008


Ответы (1)


Думайте об отношениях как о двух сторонах. Когда вы устанавливаете одну сторону отношения, другая сторона должна быть обновлена, поэтому в приведенном выше случае, наряду с установкой ProductOptionCategory, он эффективно добавляет новый объект в отношение ProductOptions на ламинатной стороне ProductOptionCategory.

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

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

person DamienG    schedule 23.12.2008
comment
Спасибо! Извините за то, что не ответил так долго. -Ваше здоровье - person Charles; 01.04.2009
comment
Ах, хороший момент. Я хотел установить параметры объекта, потому что хотел передать объект, но как только я это сделаю, он станет кандидатом на вставку. Думаю, мне просто нужно использовать венгерские приложения и иметь свой объект (например, usVariable для несохраненных) и просто использовать внешние ключи. - person Matt Mitchell; 12.05.2009