Entity Framework - Вставка объекта с несколькими моделями и базами данных - PullRequest
7 голосов
/ 06 апреля 2011

Мой домен разделен на несколько моделей Entity Framework.У меня есть несколько общих сущностей, которые охватывают несколько моделей (с именем Lookup), однако они заменяются ссылками «с помощью» с использованием методов, описанных в Работа с большими моделями в Entity Framework .Однако, что делает мой случай немного более уникальным, так это то, что я также разделяю эти модели на несколько баз данных (по одной на модель).

У меня возникла проблема при вставке одной из моих общих сущностей в мою общую БД.Ошибка:

Член с идентификатором 'Harmony.Members.FK_ResidentialAddress_ResidenceTypeLookup' не существует в коллекции метаданных.

Этот внешний ключ, на который он ссылается не существует в "общей БД".Но я также не работаю с сущностью на другой стороне отношений (названной ResidentialAddress);и при этом у меня даже нет контекста, который содержал бы инициализированный другой объект (названный MembersDb).Однако обе модели скомпилированы в одну сборку.

Нет свойств навигации, переходящих из Lookup в ResidentialAddress.Хотя есть свойство навигации в другом направлении (которое я не буду использовать - только в памяти).

My MetadataWorkspace для EntityConnection контекста CommonDb было явно инициализировано только сSSDL / CSDL / MSL для данных, необходимых для этой базы данных.Я подтвердил, что нет ссылок на внешний ключ, упомянутый в этом наборе данных схемы.

var metaAssembly = typeof(CommonDb).Assembly;
var schemaResources = new string[]
{ 
    String.Format("res://{0}/Common.ssdl", metaAssembly.FullName), 
    String.Format("res://{0}/Common.csdl", metaAssembly.FullName), 
    String.Format("res://{0}/Common.mdl", metaAssembly.FullName), 
}
MetadataWorkspace metadata = new MetadataWorkspace(schemaResources, new []{ metaAssembly });
EntityConnection connection = new EntityConnection(metadata, myDatabaseConnection);

ВОЗМОЖНАЯ КЛУБА: Это работает, когда я захожу в сгенерированные классы и удаляю всеатрибутов EdmRelationshipAttribute вместе с их парными EdmRelationshipNavigationPropertyAttribute из связанных моделей (MembersDb).

Ключевые вопросы:

  1. Так почемуэто то, что Entity Framework пытается что-то сделать с отношением, которое относится к сущности, которая не входит в область действия и не будет влиять на вставку записи!?

  2. IЯ счастлив, что сгенерированный код удаляет атрибуты, упомянутые выше, но я все еще хочу, чтобы свойства навигации остались.Как мне изменить CSDL для достижения этой цели?

ПРИМЕЧАНИЕ. Постоянство «дочерних» моделей не является приоритетом и не является целостностью их теперь внешних кросс-БД внешних ключей.,Эти базы данных сохраняются с использованием SQL CE, но изначально они были созданы из одной основной базы данных SQL Server.

1 Ответ

7 голосов
/ 08 апреля 2011

Если каждая часть вашей модели записана в отдельную базу данных, то, возможно, файлы edmx не должны знать друг о друге (об объектах или отношении к объектам, которые не принадлежат им).Как насчет попробовать один из следующих подходов:(Чтобы в итоге получить одинаковые классы сущностей для каждой части, но EF забывает о связях между ними.)

  1. Удалите «употребления» из edmx + отмените автогенерацию и создайте классы самостоятельно.
  2. Удалите «usings» из edmx + измените шаблон t4, чтобы при создании классов было прочитано более одного edmx.
  3. Скопируйте файлы edmx в сторону, чтобы у вас было два набора edmxs.3.a.Используйте набор # 1 для автоматической генерации объектов.3.b.Модифицируйте набор # 2, удалив «usings» и используйте его для генерации классов репозитория (наборов объектов).

Дайте мне знать, если одна из этих работ.

Удачи, Дэнни.

...