“System.Data.Linq.DataContext”类型是在一个未被引用的程序集中定义的。

12

问题

在访问特定页面时出现错误(在本地调试中):CS0012:类型“System.Data.Linq.DataContext”是在未被引用的程序集中定义的。您必须添加对程序集“System.Data.Linq,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。

下面是错误消息中引用的代码行:

第28行:
第29行:
第30行:public class _Page_Views_blah_granny_cshtml : System.Web.Mvc.WebViewPage {
第31行:
第32行:#line hidden

其他所有页面都很好 - 仅在访问特定页面时才会出现此问题。参考在所有其他页面上工作正常。据我所能确定,这不是参考的问题。

我花了很多时间研究这个问题。

我找到的所有答案都建议去web.config文件中,在system.web > configuration > assemblies中放置一个关于linq的程序集引用。但我的web.config文件中没有列出程序集,我怀疑这只适用于旧版本。无论如何,我还是试了一下。它给了我另一个错误,说它不知道该怎么处理程序集。

我删除了system.data.linq并重新添加了它。

我重新启动了VS和我的计算机。

我的代码 - 默认由VS生成的代码中有System.Linq。

背景 - 这是如何开始的:

该应用程序使用MVC 4和C#编写。

我在我的DataContext中创建了一个新类,添加了一个新控制器,并创建了一个强类型视图。

以下是一些非常相似的代码(可能不需要,但以防万一)。

两个类:

public class granny { 
            public string data { get; set; }
            public string criteria { get; set; }
}

public List<granny> getGranny() {
    var a = from x in grannytable
            join dx in anothertable
            on x.criteria equals dx.criteria
            select new granny {
                data = x.somenewdata;
            }; 
    return a.ToList();
}

这里是控制器:

    public ActionResult granny() {
        return View(db.getGranny());
    }

没有什么花哨的东西。

这个页面是一个典型的 Razor 视图,强类型为 "List"。它有一个表格,迭代创建,并在进行数据转储。

如有需要,我很乐意提供任何额外的代码。

我没有修改 web.config。我没有删除或调整页面上的任何引用。所有其他视图都非常出色。

当我在本地运行时,尝试访问 /granny,就会出现上述错误。

感谢您的帮助!

解决方案:我进入了引用,并针对 System.Linq(或对于旧版本,我想是System.Data.Linq)将 CopyLocal 更改为 True。


忘记在配置文件中的程序集,你的项目是否只有一个“普通”的引用集?(在解决方案资源管理器中,是否有一个“引用”项?) - Jon Skeet
当然有。它引用了System.Data.Linq。我删除了引用并重新添加,以为有什么问题。我正在使用包含的.NET System.Data.Linq。它指向C:\Program Files\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\System.Data.Linq.dll,就像应该的那样。值得注意的是,我的其他页面都可以很好地使用linq。我不认为这是一个linq引用问题,因为它不是一个普遍性的问题 - 只是这一页出了问题。 - shubniggurath
1
你能提供一个完整的解决方案或项目来演示这个问题吗? - Phil
整个解决方案?还是你对特定的文件或属性感兴趣? - shubniggurath
对于任何遇到这个问题的可怜人,编辑 System.Linq 的属性 > 将 CopyLocal 设置为 True 对我有用。 - shubniggurath
显示剩余2条评论
3个回答

29

这个方法对我有用:

  • 导航到Web项目的References节点
  • 找到System.Data.Linq的引用
  • 打开VS属性窗口
  • 在属性窗口中,将Copy Local: False更改为True

在此之前,System.Data.Linq.dll未被复制到bin目录中。 (手动将其复制到bin目录中也可以解决错误)


+1 很好。一年后仍然适用。对于其他人,当使用 dbml 数据上下文时,我在 Umbraco 7 WebApi 控制器中遇到了这个问题。如 Chris 所描述的那样进行本地复制即可解决。干杯 - Marc D.
1
为什么这个可以工作?如果已经引用了,System.Data.Linq.dll不应该总是可用的吗? - Protector one
很可能应该是这样的。我想,问题在于它被标记为Copy Local: False。我不知道这是怎么发生的。 - Chris F Carroll

9

MVC无法即时编译您的视图。看起来您的视图包含对DataContext的引用。在web.config中添加一个引用应该告诉编译器查找文件:

<configuration> 
 <system.web>
  <compilation targetFramework="4.0"> 
    <assemblies> 
      <add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
   </assemblies> 
</compilation>

注意: 该程序集应该被添加到编译元素中。

您能分享一下您的视图、控制器和数据上下文代码吗?


在MVC 4中,无需添加程序集。 - shubniggurath

9

在你的问题视图的顶部添加@using System.Data.Linq, 并将 <add namespace="System.Data.Linq" /> 添加到你Views文件夹下的<pages>部分中。


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