C# VS告诉我添加对看似无关的程序集的引用。如何找出原因?

C# VS告诉我添加对看似无关的程序集的引用。如何找出原因?,c#,.net,visual-studio-2010,C#,.net,Visual Studio 2010,我创建了一个新的单元测试项目来测试我的NHibernate映射。 NHibernate映射位于也包含EF实体的项目中。 在我的单元测试中,我只使用甚至没有对实体框架的间接引用的类型,但是,当我编译单元测试项目时,我仍然得到以下错误: 类型“System.Data.Objects.DataClasses.IEntityWithRelationships”是在未引用的程序集中定义的。必须添加对程序集“System.Data.Entity,Version=3.5.0.0,Culture=neutral

我创建了一个新的单元测试项目来测试我的NHibernate映射。
NHibernate映射位于也包含EF实体的项目中。
在我的单元测试中,我只使用甚至没有对实体框架的间接引用的类型,但是,当我编译单元测试项目时,我仍然得到以下错误:

类型“System.Data.Objects.DataClasses.IEntityWithRelationships”是在未引用的程序集中定义的。必须添加对程序集“System.Data.Entity,Version=3.5.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用

有没有办法找出为什么需要这个参考?我已经检查了所有使用过的类多次,但找不到任何东西

我觉得我错过了一些东西…

我想退房。将其加载到.csproj中,然后查找项目中的所有资源及其使用位置。可能值得一试,以找出需要该DLL的位置。

您可以使用CheckAsm工具。加载项目中直接引用的所有程序集,并找出使用缺少引用的程序集。然后,您需要询问该引用的提供者为什么需要该程序集


希望这会有帮助。

我唯一能想到的是。。。由于您使用的是NHibernate和EF,我猜您正在执行某种类型的POCO实现。我在网上看到了一些关于使用NHibernate和EF实现POCO的内容,您定义的基类实现了IEntityWithRelationships接口。如果是这样的话,可以解释一下。

可能是您的某个类与EF类同名吗?然后可能是VS生成代码,将接口IEntityWithRelationships应用于类,以模拟类的POCO映射

要将POCO实体与数据模型一起使用,实体类型的名称必须与自定义数据类的名称相同,并且实体类型的每个属性必须映射到自定义数据类的公共属性。类型和每个映射属性的名称必须等效


来源:

您引用的库具有公共方法或属性,该方法或属性返回“System.Data.Objects.DataClasses.IEntityWithRelationships”或将其作为参数。不管怎样,您实际上正在使用该方法,因为它是公共的,所以您的代码必须能够确定您正在引用的库中所有方法的方法签名。如果该方法是内部的,您就看不到问题。

我想您只是试图双击错误?这通常会转到使用未知类型(返回值/属性或继承/实现)的实际点


若那个不起作用,那个么它一定是在编译器的魔法代码中(可能是像人们指出的那个样针对EF,或者其他地方)。在这种情况下,我的建议是向测试程序集添加引用。然后在Reflector中打开它并查看已编译的MSIL。由于它为您提供了一个特定的接口,您甚至可以访问该接口并询问Reflector它的引用位置,以查看它在程序集中的位置。

您可以使用DLL检查工具(如(freee!),或)查看测试引用的DLL。希望您能很快找到带有Using语句的那个,并更清楚地了解正在发生的事情

如前所述,双击将调出错误位置,但只有当它在您编写的代码中时,第三方DLL自然不会起作用


祝你好运:)

如果你确定你没有使用继承或实现System.Data.Entity中任何类型的类型,这可能会深深地埋藏在继承链中,与使用返回DAL中定义的对象的方法类似,该对象直接实现IEntityWithRelationships,或者从DAL中定义的基类获取实现,当您尝试查找引用时,这将隐藏System.Data.Entity对测试程序集的使用,因为它将显示为被DAL中的实体使用。。。(取决于您使用什么功能来确定这一点,我只是猜测类似“查找用法”的内容)


例如,在你的A、B、C示例中。。。假设A使用从C2继承的B3类。在C2上搜索用法时,您只会找到B3而不是A。但由于A使用继承C2的B3,A需要对C的引用,这可能是不相关的,但我不久前也有类似错误,我清除了ASP.NET程序集缓存文件夹,并解决了我的问题

文件夹在这里

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

它保存的是我的程序集的旧版本

如果NHibernate包含到包含EF实体的项目的映射,则System.Data.Entity将是必需的引用。@Ramhound:我不理解您的评论。你能澄清一下吗?NHibernate不包括任何映射,因为我使用网站上的默认NHibernate版本…如果您给出答案,请使用应答方法,而不是注释:)。好的,这是引用给定项目引用的程序集依赖项的一条必须规则。@sll:不,不是。只有在使用需要其他程序集的类型时,才需要添加对该其他程序集的引用。示例:项目
A
参考
B
B
有两类:
B1
B2
B1
有一个返回字符串的方法,
B2
有一个返回
C1
的方法<代码>C1在组件
C
中定义,该组件仅由
B
引用,而不是由
A
引用。如果
A
现在只使用
B1
,则无需在
A
中引用
C
。即使我在
A
中使用
B2
,也不需要引用
C
,除非我使用返回
C1
的方法