为什么VS 2015需要引用System.Data.Entity,而VS 2013不需要?

6
我已经安装了VS 2015(不过我之前也安装了RC版)。我打开了一个在VS 2013中正常工作的现有解决方案,但出现了以下错误:
BC30652 编译时需要引用程序集 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 才能使用其中的类型 'EntityObject'。请将其添加到项目中。
我按照VS的建议在项目中添加了对System.Data.Entity的引用,这样就可以正常工作了。然而,我想知道为什么会出现这种情况。
如果我删除System.Data.Entity的引用,在VS 2013中仍然可以工作,但在VS 2015中会出错。该项目确实引用了System.Data。
关于此解决方案的注释:
- 最初是在VS 2013中开发的。 - .NET 4.0。 - 还引用了System.Data。 - 有两个项目,一个主项目(导致错误)和一个数据访问层(DAL)。 - DAL有一个实体数据模型(.edmx)。

1
这只是一种猜测,但这可能是由于编译器处理传递依赖关系的方式发生了变化。例如,假设您的项目A依赖于库B,并且B公开了从EntityObject派生的公共类型C。那么,A是否需要对Entity Framework进行引用通常取决于它对类C的操作。不幸的是,这方面没有硬性规定,这可能取决于编译器的实现。由于VS 2015和.NET 4.6配备了新的C#和VB编译器,规则可能以微妙的方式发生了变化。 - divega
@divega 你知道我可以如何测试你的试探性尝试吗? - Tony L.
首先,您能确认您的应用程序依赖于公开类型派生自EntityObject的库吗?如果是,请在您的问题中添加更多关于应用程序代码如何与该类型交互的信息。有了这些信息,我们可能可以创建一个简单的重现(不需要涉及EF),我们可以向语言专家提出。如果您想要的话,也可能会想出一种解决方法,以便您不需要添加引用。 - divega
3
我可以证实,至少对我来说,VS 2015破坏了传递依赖关系。我有一个简单的解决方案,其中项目A引用库B,后者又引用库C。项目A没有直接引用库C,而是通过库B使用其中的一个类型。自2003年以来,在每个VS中都能正确编译和运行,但在2015年无法通过。我收到了相同的错误代码BC30652。 - Petar Slavov
导致错误的项目引用了数据访问层。DAL具有实体数据模型。我认为你们正在做对的事情。 - Tony L.
显示剩余2条评论
1个回答

9

我从Visual Basic语言团队得到了确认,这很可能是由于他们在Visual Studio 2015中编译器做出的变更导致的:

...我们确实努力尝试让事情更加宽松。但总结是编译器可能需要更多的引用来保证正确性。如果可以的话,请添加它们。如果您调用灯泡,则认为有一种快速修复方法。


谢谢,这解释了我在这个问题中的困惑:https://stackoverflow.com/questions/53538749/problem-with-moving-vb-net-from-vs-2010-to-vs-2017 - Hultan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接