“Objects”类型或命名空间在“System.Data”命名空间中不存在。

109
我正在使用实体框架、C#和SQL Server创建一个n层应用程序。我正在创建一些适用于所有数据访问层组件的基础类。在这个基础类中,我想要处理由实体对象继承的ObjectContext基类的连接状态。
编译会抛出以下错误:
“类型或命名空间名“Objects”在命名空间“System.Data”中不存在(是否缺少程序集引用?)”。
同时,因为同样的原因,“using”语句System.Data.Objects也无法解析。
我尝试添加程序集引用,但在程序集引用的.NET选项卡中找不到它。
有什么想法吗? 谢谢!
9个回答

213
您需要添加对.NET程序集System.Data.Entity.dll的引用。

1
成功了!不知道System.Data.Entity中是否确实存在System.Data.Objects命名空间? - pencilslate
1
嗯...当我在NuGet中搜索时,甚至看不到它。 - BVernon

57
如果您正在使用Entity Framework 6,则命名空间已更改。您需要使用:
System.Data.Entity.Core.Objects.ObjectQuery

我通过nuget包管理器安装了Entity Framework 6.1.3,但我尚未引用Microsoft的程序集System.Data.Entity。这给了我一些错误。因此,我的问题是,在添加using语句之前,我需要首先引用System.Data.Entity吗? - vibs2006

33

升级了一段时间的EF5到EF6 NuGet,但一直遇到这个问题。我通过更新生成的代码以引用System.Data.Entity.Core.Objects来临时修复它,但在生成后,它会再次更改回去(因为它是生成的)。

以下解决方案可以永久解决该问题:

http://msdn.microsoft.com/en-us/data/upgradeef6

如果您有使用EF Designer创建的模型,则需要更新代码生成模板以生成与EF6兼容的代码。注意:目前仅提供了Visual Studio 2012和2013的EF 6.x DbContext Generator模板。

  1. 删除现有的代码生成模板。这些文件通常被命名为<edmx_file_name>.tt<edmx_file_name>.Context.tt,并嵌套在Solution Explorer中的edmx文件下。您可以在Solution Explorer中选择模板,然后按Del键将其删除。
    注意:在Web Site项目中,模板不会嵌套在edmx文件下,而是在Solution Explorer中与其并列显示。
    注意:在VB.NET项目中,您需要启用“显示所有文件”才能看到嵌套的模板文件。
  2. 添加适当的EF 6.x代码生成模板。在EF Designer中打开您的模型,右键单击设计表面,然后选择添加代码生成项...
    • 如果您使用的是DbContext API(建议使用),则可以在Data选项卡下找到EF 6.x DbContext Generator
      注意:如果您正在使用Visual Studio 2012,则需要安装EF 6工具才能使用此模板。有关详细信息,请参见获取Entity Framework
    • 如果您正在使用ObjectContext API,则需要选择在线选项卡并搜索EF 6.x EntityObject生成器
  3. 如果您对代码生成模板进行了任何定制,则需要将它们重新应用于更新后的模板。

4

如果你想使用"System.Data.Objects.EntityFunctions",

在EF 6.1+中,请使用"System.Data.Entity.DbFunctions"


3

3
在我的情况下,针对EF 6+,当使用以下内容时:
System.Data.Entity.Core.Objects.ObjectQuery

作为这个命令的一部分:
var sql = ((System.Data.Entity.Core.Objects.ObjectQuery)query).ToTraceString();

我遇到了这个错误:

Cannot cast 'query' (which has an actual type of 'System.Data.Entity.Infrastructure.DbQuery<<>f__AnonymousType3<string,string,string,short,string>>') to 'System.Data.Entity.Core.Objects.ObjectQuery'

所以我最终不得不使用这个:
var sql = ((System.Data.Entity.Infrastructure.DbQuery<<>f__AnonymousType3<string,string,string,short,string>>)query).ToString();    

当然,您的匿名类型签名可能不同。
希望对你有所帮助。

1

对于EF6,请使用以下using语句替换"xxxx.Context.cs"

using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Entity.Core.Objects;
using System.Linq;

0

你需要添加对.NET程序集System.Data.Linq的引用


Null29,你能解释一下为什么你的答案比已经给出的更好吗? - Noel Widmer

0

我已经添加了一个对.dll文件的引用,针对System.Data.Linq, 但上述操作不足以解决问题。你可以在以下版本的各个目录中找到.dll文件。

System.Data.Linq C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Data.Linq.dll 3.5.0.0

System.Data.Linq C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client\System.Data.Linq.dll 4.0.0.0


2
更正这个回答的问题:在命名空间'System.Data'中不存在类型或命名空间名称'Linq'。 - Tom Cubbins

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