CS0012错误:类型'System.Data.Linq.DataContext'在未被引用的程序集中定义

6

你好,我遇到了以下错误:

CS0246:找不到类型或命名空间名称'DataClasses1DataContext'(您是否缺少使用指令或程序集引用?)

这是针对以下 .aspx 文件的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class WebApplication1_admin_Places : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataClasses1DataContext db = new DataClasses1DataContext();
        var query = (from m in db.Places orderby m.Name select m);
        PlacesList.DataSource = query;
        PlacesList.DataBind();
    }
}

问题是,在 / 文件夹中,我可以访问数据库,但在 /admin 文件夹中,我收到这个错误。
我做错了什么?
编辑
CS0012:类型“System.Data.Linq.DataContext”在未引用程序集中定义。您必须添加对程序集“System.Data.Linq,Version=3.5.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”的引用。
那是什么意思?

查看我的评论以解决最新的错误。 - RPM1984
8个回答

5

以下是一些开始的地方:

  • DataClasses1DataContext所包含的dll在哪里?你能从一个文件夹获取它而不能从另一个文件夹获取,这有什么原因吗?
  • 管理文件夹中是否有配置文件覆盖了根配置文件中设置的值?

编辑

看起来这是一个配置问题。配置可能表明msl(模型)文件在当前目录中,但实际上它在根目录中。因此,当你在根目录下时,它可以工作,但当你在管理文件夹中时,它就无法工作。

请参考“使用Entity Framework Entity Connection时的MetadataException”以解决类似的问题。


他遇到的是“编译器错误”,而不是运行时错误。这意味着它与相对路径/绝对路径或配置无关(这些会导致运行时错误)。我认为他只需要正确引用程序集即可。 - RPM1984
DataClasses1.dbml位于\,但试图使用它的.aspx文件位于\adamin\。如何解决此问题? - natiz
好的,管理文件夹中没有Web.config文件,应该有吗? - natiz

5
当尝试加载程序集的时候,即使该程序集已被项目引用,仍可能因.ASPX标记而出现此错误!在此提到的项目范围解决方案是将程序集添加到web.config中的程序集列表中进行编译,例如:这里,请参阅编译程序集元素
<compilation>
 <assemblies>
  <add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
  ...

在每个页面上进行替代的方法是使用@ Assembly 页面属性,但这需要添加到每个页面,导致ASP.NET运行时尝试加载缺失的程序集类型。

1

我也遇到了同样的错误信息。通过在VS 2010引用对话框中添加对System.Data.Linq的项目引用来解决。


我也通过这种方式解决了它,唯一的问题是我不知道为什么一开始需要这样做。 - kad81

1

你说的 "在 / 文件夹中我可以访问 DB,但是在 /admin 文件夹中出现了错误" 是什么意思?

这并不会因为你在哪个文件夹而有所区别——上下文使用配置文件中的连接字符串(例如 web.config),相对/绝对路径不适用于此处,这是代码,不是资源。

你的数据上下文是否与 Web 应用程序分开成为一个单独的程序集?

你需要导入命名空间,就像其他事情一样:

E.g

using YourApplication.Data;

好的,我的管理文件夹上没有Web.Config,应该有吗? - natiz
@NZIM - 这个错误意味着你需要在你的Web应用程序中引用 System.Data.Linq。添加 -> 引用 -> System.Data.Linq。这是因为你正在UI中执行L2SQL操作。如果你将L2SQL代码封装在一个仓库后面,你就不需要添加这个引用了。但是,现在先添加对 System.Data.Linq 的引用。 - RPM1984
关于 web.config - 将连接字符串放在“主”web.config(根目录)中。区域的 web.config 继承自主 web.config,因此不应覆盖数据库连接(这对所有区域都是全局的)。如果有必要,在区域的 web.config 中应该只包含诸如命名空间注册之类的内容。 - RPM1984
1
我已经添加了System.Data.Linq,但现在我得到的是:CS0234:命名空间'System.Data'中不存在类型或命名空间名称'Linq'(您是否缺少一个程序集引用?) - natiz
请阅读此帖子:http://forums.asp.net/t/1264863.aspx,您可能需要在 web.config 文件中添加一些内容。 - RPM1984
显示剩余2条评论

1
导航到Web项目的“引用”节点,找到对System.Data.Linq的引用。打开VS属性窗口,在属性窗口中将“复制本地”从False更改为True。在此之前,System.Data.Linq.dll未被复制到bin目录中。(手动将其复制到bin目录中也可以解决错误)。
来源: https://dev59.com/EGUo5IYBdhLWcg3w-zii#34356930

0

所以对我来说,解决方法是将LINQTOSQL添加到我使用它的文件夹中+在webConfig文件中添加以下内容:

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


0
如果这个项目是 LinqToSql 项目,并且数据上下文为 "DataClasses1DataContext",则 dbml 文件名应该为 "DataClasses1.dbml"。
如果 .dbml 文件名为 "MyLinqToSql.dbml",则数据上下文名称应为 MyLinqToSqlDataContext。
请检查 .dbml 文件名,并按照上述说明匹配数据上下文名称。
此外,如果您开始输入,IntelliSense 将自动获取名称。

0

在C#中添加对您的模型的引用。

using ProjectName.Models;

然后在Application_Start()例程中添加以下行:Database.SetInitializer<MyMVCTestContext>(null);(这里的MyMvcTestContext将是您的数据上下文名称)

检查以下列表,确保您没有漏掉任何引用。您可能需要全部或部分引用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using System.Web.ModelBinding;
using System.Data;
using System.Data.Entity;
using MyMVCTest.Models;

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