Entity Framework - Вставка объекта с несколькими моделями и базами данных

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

У меня возникла проблема при вставке одного из моих общих объектов в общую базу данных. Это терпит неудачу с ошибкой:

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

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

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

мой 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. Я рад, что сгенерированный код удаляет атрибуты, упомянутые выше, но я все еще хочу, чтобы свойства навигации остались. Как бы я изменил CSDL для достижения этой цели?

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

1 ответ

Решение

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

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

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

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

Удачи тебе, Дэнни.

Другие вопросы по тегам