VS говорит мне добавить ссылку на, казалось бы, несвязанную сборку. Как узнать, почему?

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

Тип "System.Data.Objects.DataClasses.IEntityWithRelationships" определен в сборке, на которую не ссылаются. Вы должны добавить ссылку на сборку "System.Data.Entity, Version = 3.5.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089".

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

У меня такое чувство, что я здесь что-то не хватает...

Ответ 1

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

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

Удачи:)

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

папка находится здесь

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

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