Подтвердить что ты не робот

EF4 Poco Типы сопоставления ошибок То же имя Одна и та же сборка Различные пространства имен

У меня возникла проблема с EF4 и прокси-серверами.

У меня есть 2 класса с тем же именем в одной и той же сборке, но разные пространства имен:

QuoteModels.CashPayment
OrderModels.CashPayment

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

Указанная схема недействительна. Ошибки: \ r\n Отображение типа CLR для EDM тип неоднозначен, поскольку несколько CLR типы соответствуют типу EDM 'Наличный расчет'. Ранее найденная CLR тип 'QuoteModels.CashPayment', недавно найден тип CLR 'OrderModels.CashPayment'

Существует ли способ обхода классов с тем же именем в одной сборке с разными пространствами имен для работы с Ef4?

Должен ли я дать им разные имена или переместить их в другую сборку?

4b9b3361

Ответ 1

Я нашел работу. Это очень очевидная работа, которая не идеальна, но я думаю, что я назову это достаточно хорошим для нас, пока EF5 не выйдет, чтобы исправить это.

Краткий ответ: Просто переименуйте одно или оба из неопределенных объектов. Например: 2x Person переименованы в: Personal_Person и Work_Person на основе PersonalContext и WorkContext.

Длинный ответ:. В нашем сценарии мы используем подход DB-first (мы переписываем устаревшее приложение с минимальными изменениями в DB). Наша БД содержит сотни таблиц, поэтому вместо использования одного EDMX/Context я использую несколько EDMX/Contexts (EDMX сжимал каждый раз, когда я пытался добавить более половины наших таблиц). Однако некоторые таблицы должны существовать более чем в одном EDMX/Context.

Для обсуждения предположим, что у нас есть простая база данных со следующими таблицами:

  • Person
  • Family
  • Relationship
  • Address
  • Business
  • Employee

Кроме того, ради этого обсуждения допустим, что любая ANY-таблица, которая существует в нескольких контекстах, вызывает эту проблему (как я сказал в комментариях к ответу Devart, это не так, и я не понимаю, почему это иногда работает).

Теперь предположим, что мы хотим создать два контекста:

PersonalContext:

  • Person
  • Family
  • Relationship
  • Address

WorkContext:

  • Person
  • Business
  • Address
  • Employee

В этом случае оба Person и Address вызовут нашу проблему. Итак, что мы будем делать в нашем EDMX-сопоставлении, просто переименуем наши сущности в Personal_Person/Work_Person и Personal_Address/Work_Address.

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

Теперь я все еще обсуждаю, буду ли я делать это таким образом или, возможно, пронумеровать имя для каждой сущности (Personal_Person, Personal_Family, Personal_Relationship, Personal_Address и Work_Person, Work_Business, Work_Address и Work_Employee) как для согласованности, так и для Intellisense-дружелюбия (сохраняя все сущности в собственном алфавитном порядке), так как на самом деле пространство имен принадлежит перед именем, а не после него, но это решение и не очень важно для решения проблемы.

Надеюсь, это поможет!

Ответ 2

Взгляните на этот пост. Комментарий Derek, похоже, касается одной и той же проблемы, и он не получил ответа от Microsoft.

Ответ 3

Я столкнулся с подобной проблемой. Мне потребовалось некоторое время, чтобы определить шаблон, но в моем контексте проблемы возникли, когда у меня было две модели, у которых были две одинаковые сущности.

На одной из моих моделей у меня были следующие сущности ( "- > " обозначает отношение с направлением): Users -> Authentication -> Authorization (пользователь получает аутентификацию, затем авторизуется).

С другой стороны, у меня были следующие сущности: Authentication -> Authorization -> InvoiceGeneration (аутентифицированный и авторизованный пользователь создает счет-фактуру).

После запуска моего приложения с этими двумя моделями я получил ту же ошибку, что и исходный плакат.

Оказалось, что моя проблема исчезла, когда я удалил объект Authentication из второй модели, поэтому кажется, что EDM для CLR mapper не может справиться с объектами, которые имеют одинаковые "родительские" отношения (на обоих моих моделях Authorization предшествовал Authentication. Извините за ненаучные описания отношений:)

Ответ 4

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

Пример:

namespace Namespace1
{
 class Talk
 {
  public int TalkId {get; set;}
 }
}
namespace Namespace2
{
 class Talk
 {
  public int TalkId {get; set;}
  public string SomeExtraInfo {get; set;}
 }
}

Результат:

namespace Namespace1
{
 class Talk
 {
  public int TalkId {get; set;}
 }
}
namespace Namespace1
{
 partial class Talk
 {
  public string SomeExtraInfo {get; set;}
 }
}

Надеюсь, что это поможет кому-то