EF Code First отображает внутреннюю ассоциацию - PullRequest
3 голосов
/ 24 января 2012

У меня проблема, которая поставила меня в тупик.У нас есть сборка модели и сборка репозитория.Слой модели содержит классы, которые сопоставляются с нашей базой данных производными DbContext репозиториями на уровне репозиториев.До сих пор они шли без заминки.

В модели у нас есть связь один ко многим Вопрос 1 - * Ответ (Question.Answers и Answer.Question являются сопоставленными навигационными свойствами).Теперь у нас есть требование пометить Вопрос.Ответы как внутренние, поскольку это не имеет смысла вне модели.Когда мы вносим изменение с: public virtual IList<Answer> ... на internal virtual IList<Answer> ..., мы получаем исключение:

Указанный путь включения недействителен.EntityType Repositories.Question не объявляет свойство навигации с именем Answers.

Прежде всего, это исключение является странным, поскольку оно ссылается на тип Repositories.Question, который не существует!Это должно быть Model.Question.

В сборке Model InternalsVisibleTo уже установлено значение Repositories:

[assembly: InternalsVisibleTo("Repositories")]

Это означает, что мы не получим ошибки компиляции в коде сопоставления, и мы попробовалиследующее:

[assembly: InternalsVisibleTo("EntityFramework")]
[assembly: InternalsVisibleTo("System.Data.Entity")]

Но мы все еще получаем вышеупомянутое исключение.

Есть идеи, почему мы получаем это?


Редактировать

ЛадиславМрнка, спасибо за помощь!Это все еще причиняет нам боль.

Мы уже определили отношение, используя свободный API:

modelBuilder.Entity<Answer>()
    .HasRequired(a => a.Question)
    .WithMany(q => q.Answers)
    .Map(x => x.MapKey("QuestionId"));

И это работает, когда свойство q.Answers установлено в public.Данные читаются и записываются в базу данных без проблем.Когда мы изменяем его на внутренний, наш код по-прежнему компилируется (как мы используем InternalsVisibleTo), но мы получаем вышеупомянутое исключение при запуске наших интеграционных тестов.

Я изменил строку подключения на новое имя каталога иEF без проблем создает базу данных и ожидаемые ограничения.Так что все работает как положено.Проблема возникает только при изменении модификатора доступа к свойствам навигации

С уважением,

Стивен

Ответы [ 2 ]

2 голосов
/ 24 октября 2012

Попробуйте с защищенным внутренним виртуалом.

1 голос
/ 24 января 2012

Прежде всего, это исключение странно, так как оно ссылается на тип Репозитории. Вопрос, которого не существует! Так должно быть Model.Question.

Это внутреннее поведение EF. У вас есть класс с именем Model.Question, но внутри EF есть что-то с именем Repository.Question, содержащееся в отображении - это было то же самое с EDMX, где у вас был класс POCO, но у сущности на диаграмме было «другое пространство имен».

Возможно, ваше внутреннее свойство навигации не было отображено. Можете ли вы попытаться создать базу данных из вашей модели и проверить, правильно ли установлены отношения между таблицами Answers и Questions? Если нет, попробуйте явно определить это отношение с помощью API.

...