Использование обоих ObjectContext и DbContext - PullRequest
6 голосов
/ 11 августа 2011

Сценарий. Попытка извлечь и перегруппировать информацию из одной базы данных в другую. В БД А есть некоторые данные, которые я хочу получить. Я хочу сохранить его в БД B в несколько иной структуре.

DB A Я использую модель, сгенерированную базой данных EDMX, поэтому она использует производную ObjectContext. БД Б Я хотел бы, чтобы код был сгенерирован. Поэтому я использую код / ​​модель в первую очередь, установив EntityFramework 4.1 через менеджер пакетов. Таким образом, DB B использует производную DbContext

Когда я пытаюсь сохранить информацию из БД А в БД, это говорит:

Метод тестирования RoutIT.Irma.Import.Service.Test.ImportIrma2ProductTests.ImportProducts выбросил исключение: System.ArgumentException: Не удалось найти концептуальный тип модели для «Некоторые объекты в модели EDMX БД А»

Это действительно происходит при добавлении сущности DB B в свойство DbSet производного DbContext DB B. Так что код похож на

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
            foreach (FirstPVC pvc in pvcs)
            {
                this._irmaImport.FirstPVCs.Add(pvc); <--
                this._irmaImport.SaveChanges();
            }
            scope.Complete();
        }
 }

Это происходит в точке кода, отмеченной стрелкой выше ("<-") </p>

FirstPVC - это свойство DB B, но в точке стрелки он указывает на отсутствие концептуальной модели для сущности, принадлежащей контексту DB B.

Это странно, поскольку я пытаюсь сохранить сущность DB B в контексте DB B. Почему это должно заботиться о сущностях БД А.

Все контексты содержатся в одном проекте. Но Derived DbContext из DB B знает только о своих собственных свойствах DbSet <>, внезапно при попытке добавить что-либо к свойству DbSet <> появляется ошибка, выделенная жирным шрифтом выше.

Кто-нибудь знает, почему это происходит? Почему DbContext должен заботиться о сущностях другого контекста, в частности, одного из производных классов ObjectContext.

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

[EdmEntityTypeAttribute(NamespaceName="Irma2Model", Name="AccessProvider")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class AccessProvider : EntityObject
{
    /*****...... ******/
}

1 Ответ

6 голосов
/ 12 августа 2011

Найден ответ, но это не то, что вы хотите услышать:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/d2a07542-cb33-48ba-86ed-4fdc70fb3f1a

"Если вы используете генерацию кода по умолчанию для файла EDMX, то сгенерированные классы содержатряд атрибутов, помогающих EF найти, какой класс использовать для каждого типа сущности. В настоящее время EF имеет ограничение, согласно которому классы POCO нельзя загружать из сборки, содержащей классы с атрибутами EF. (Краткий ответ - нет, ваши классы должныбыть в отдельных проектах).

Это несколько искусственное ограничение, и мы понимаем, что это болезненно, и в будущем мы попытаемся его устранить. "на две разные сборки.

...