VS говорит мне добавить ссылку на внешне не связанную сборку.Как узнать почему? - PullRequest
11 голосов
/ 09 декабря 2011

Я создал новый проект модульного тестирования для проверки моих сопоставлений NHibernate.
Отображения NHibernate находятся в проекте, который также содержит объекты EF.
В моем модульном тесте я использую только те типы, которые даже не имеют косвенной ссылки на Entity Framework, но все же, когда я компилирую проект модульного теста, я получаю следующую ошибку:

Тип 'System.Data.Objects.DataClasses.IEntityWithRelationships' определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку 'System.Data.Entity, версия = 3.5.0.0, культура = нейтральная, PublicKeyToken = b77a5c561934e089'.

Есть ли способ узнать, зачем нужна эта ссылка? Я уже несколько раз проверил все используемые классы и ничего не смог найти ...

У меня такое ощущение, что я что-то здесь упускаю ...

Ответы [ 9 ]

1 голос
/ 21 декабря 2011

Вы уверены, что не используете типы, наследующие или реализующие какой-либо из типов в System.Data.Entity, это может быть скрыто глубоко в цепочке наследования, как, например, использование метода, возвращающего объект, определенный в вашем DAL.который либо непосредственно реализует IEntityWithRelationships, либо получает реализацию из базового класса, также определенного в вашем DAL, который будет скрывать использование System.Data.Entity из вашей тестовой сборки, когда вы пытаетесь найти ссылки, так как он будет показан как используемыйвместо этого в вашем DAL ... (В зависимости от того, какую функцию вы используете для определения этого, я просто предполагаю что-то вроде "Найти использования")

Например, в вашем примере A, B, C ... еслискажем, A использует класс B3, который наследуется от C2.При поиске использования на C2 вы найдете только B3, а не A. Но поскольку A использует B3, который наследует C2, A требует ссылку на C

1 голос
/ 21 декабря 2011

Вы можете использовать инструмент проверки DLL (например, JustDecompile (бесплатно!) Или Reflector ) и заглянуть внутрь своих DLL-библиотек, на которые ссылаются тесты. Надеюсь, вы быстро заметите один из них с помощью оператора Using и получите более четкое представление о том, что происходит.

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

Удачи:)

0 голосов
/ 02 января 2012

Возможно, это не связано, но у меня были похожие ошибки некоторое время назад, я очистил папку кэша сборок ASP.NET, и это исправило мою проблему.

папка здесь

{windows folder}\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files

и он держал старую версию моей сборки

0 голосов
/ 15 декабря 2011

Я полагаю, вы пытались просто дважды щелкнуть по ошибке?Обычно это приводит к фактическому использованию неизвестного типа (либо возвращаемого значения / свойства, либо наследования / реализации).

Если это не сработало, то это должно быть в магическом коде компилятора (возможно, для EF).как указали люди или где-то еще).В этом случае я бы предложил добавить ссылку на вашу тестовую сборку.Затем откройте его в Reflector и просмотрите скомпилированный MSIL.Поскольку он дает вам определенный интерфейс, вы можете просто перейти к этому интерфейсу и спросить Reflector, где он указан, чтобы увидеть, где он находится в вашей сборке.

0 голосов
/ 13 декабря 2011

Вы ссылаетесь на библиотеку, которая имеет открытый метод или свойство, которое либо возвращает 'System.Data.Objects.DataClasses.IEntityWithRelationships', либо принимает его в качестве параметра.Независимо от этого вы фактически используете метод, потому что он общедоступен, и ваш код должен иметь возможность определять сигнатуры методов всех методов в библиотеке, на которую вы ссылаетесь.Если бы метод был внутренним, вы бы не увидели проблему.

0 голосов
/ 13 декабря 2011

Может ли быть так, что один из ваших классов имеет то же имя, что и EF-класс?Тогда это может быть VS, который генерирует код для применения интерфейса IEntityWithRelationships к вашему классу для имитации отображения классов POCO.

Чтобы использовать объекты POCO с моделью данных, имя объектатип должен совпадать с пользовательским классом данных, и каждое свойство типа сущности должно соответствовать общедоступному свойству пользовательского класса данных.Имена типов и каждого из сопоставленных свойств должны быть эквивалентны.

Источник: http://msdn.microsoft.com/en-us/library/dd456853.aspx

0 голосов
/ 09 декабря 2011

Единственное, о чем я могу думать, это ... Так как вы используете NHibernate и EF, я предполагаю, что вы делаете какую-то реализацию POCO.В Интернете я видел кое-что о реализации POCO с помощью NHibernate и EF, где определяемые вами базовые классы реализуют интерфейс IEntityWithRelationships.Если бы это было так, это объяснило бы.

0 голосов
/ 09 декабря 2011

Вы можете использовать http://checkasm.booring.net/ CheckAsm tool. Загрузите все свои сборки, на которые вы ссылаетесь непосредственно в вашем проекте, и выясните, какая из них использует отсутствующую ссылку. Оттуда вам нужно спросить поставщика этой ссылки, зачем им нужна эта сборка.

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

0 голосов
/ 09 декабря 2011

Я бы проверил Фисташка .Это сделано для загрузки в .csproj, а затем найти все ресурсы в проекте и где они используются.Возможно, стоит попытаться выяснить, где нужна эта DLL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...