【问题标题】:ASP.NET 5 EntityFramework.Core 7.0.0-rc1-final issue - Compiler wants 7.0.0.0 to be referenced which is not foundASP.NET 5 EntityFramework.Core 7.0.0-rc1-final 问题 - 编译器希望引用未找到的 7.0.0.0
【发布时间】:2016-04-06 00:32:52
【问题描述】:

我也有同样的问题。我在project.json 文件中添加了以下依赖项:

"dependencies": {
    "EntityFramework": "7.0.0-beta4",
    "EntityFramework.Core": "7.0.0-rc1-final",
    "EntityFramework.SqlServer": "7.0.0-beta8",
    "EntityFramework.Commands": "7.0.0-rc1-final"
  },
  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel",
    "ef": "EntityFramework.Commands"
  },
...

我使用dnu install EntityFrameworkdnu install EntityFramework.SqlServer 来安装软件包。 "EntityFramework": "7.0.0-beta4", 由安装程序自己自动写入dependencies 节点下。

问题/问题 1:令我惊讶的是,当我为 EntityFramework 提取智能时,我展示的可用版本只有 6.1.3

问题 2:当我使用 dnu build 编译我的应用程序时(我在 dependencies 节点下手动添加 EntityFramework 程序集(.Core.Commands)后运行了 dnu restore 命令,我得到了一堆编译错误:

The type 'DbContextOptionsBuilder' is defined in an assembly that is not referenced. You must add a reference to assembly 'EntityFramework.Core, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null'.
D:\Projects\aspnet\apiservice\Models\SampleData.cs(12,41): DNXCore,Version=v5.0 error CS0308: The non-generic method 'IServiceProvider.GetService(Type)' cannot be used with type arguments
D:\Projects\aspnet\apiservice\Models\SampleData.cs(13,32): DNXCore,Version=v5.0 error CS0308: The non-generic method 'IServiceProvider.GetService(Type)' cannot be used with type arguments
D:\Projects\aspnet\apiservice\Models\SampleData.cs(14,29): DNXCore,Version=v5.0 error CS1061: 'object' does not contain a definition for 'Books' and no extension method 'Books' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
D:\Projects\aspnet\apiservice\Models\SampleData.cs(15,42): DNXCore,Version=v5.0 error CS1061: 'object' does not contain a definition for 'Authors' and no extension method 'Authors' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
D:\Projects\aspnet\apiservice\Models\SampleData.cs(17,43): DNXCore,Version=v5.0 error CS1061: 'object' does not contain a definition for 'Authors' and no extension method 'Authors' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
D:\Projects\aspnet\apiservice\Models\SampleData.cs(19,45): DNXCore,Version=v5.0 error CS1061: 'object' does not contain a definition for 'Authors' and no extension method 'Authors' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
D:\Projects\aspnet\apiservice\Models\SampleData.cs(22,29): DNXCore,Version=v5.0 error CS1061: 'object' does not contain a definition for 'Books' and no extension method 'Books' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
D:\Projects\aspnet\apiservice\Models\SampleData.cs(61,29): DNXCore,Version=v5.0 error CS1061: 'object' does not contain a definition for 'SaveChanges' and no extension method 'SaveChanges' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

如果我删除 .Core.Commands 程序集引用项目构建正常。

然后我将EntityFramework.Core 的版本更改为7.0.0.0,如错误中所述:

The type 'DbContextOptionsBuilder' is defined in an assembly that is not referenced. You must add a reference to assembly 'EntityFramework.Core, Version=7.0.0.0, Culture=neutral, PublicKeyToken=null'.

但是dnu restore 现在给了我以下信息:

Unable to locate Dependency EntityFramework.Core >= 7.0.0
Writing lock file D:\Projects\aspnet\apiservice\project.lock.json
Restore complete, 6675ms elapsed

Errors in D:\Projects\aspnet\apiservice\project.json
    Unable to locate Dependency EntityFramework.Core >= 7.0.0

我是asp.net 5Visual Studio code平台的新手。而且我不能使用Visual Studio 2015,因为开发团队的其他成员正在使用 OSX。

这对我来说是一个学习项目。要求很简单。连接 SQL Server 数据库,使用 Entity Framework 拉取master-child 关系数据。

搞砸了!救命!!

提前致谢

更新

  1. 我可以看到project.json 中所有版本为7.0.0-rc1-final 的软件包的主要变化。我使用 Yeoman 生成器工具创建项目,但看起来您通过 Visual Studio 更正了包。那么,我是否必须手动更新软件包版本并restore 他们?

  2. Yeoman 创建/生成项目时,默认没有添加global.json 文件。我可以手动添加它并手动将代码放入其中吗?这行得通吗?

  3. 我还可以看到在 project.json 文件中添加了一些额外的包引用,这些引用是 Yeoman 生成器默认未添加的 - 例如 Microsoft.AspNet.Tooling.RazorMicrosoft.Extensions.Logging.ConsoleMicrosoft.Extensions.Logging.DebugMicrosoft.Extensions.Logging 等。它们都在项目中得到有效使用吗?因为生成器没有自动添加它们,我可以手动添加它们并使用dnu restore 恢复吗?如果我手动添加,这会对项目有什么影响吗?

【问题讨论】:

  • 请不要在代码 sn-ps 不起作用时使用它们。

标签: c# asp.net asp.net-core entity-framework-core dnu


【解决方案1】:

您应该从依赖项中删除 "EntityFramework"(删除"EntityFramework": "7.0.0-beta4" 行)并使用

"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
"EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final",
"EntityFramework.Commands": "7.0.0-rc1-final"

仅限。如果您添加了"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",则不需要显式添加"EntityFramework.Core": "7.0.0-rc1-final",因为存在以下依赖关系:

"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final":
    "EntityFramework.Relational": "7.0.0-rc1-final":
        "EntityFramework.Core": "7.0.0-rc1-final"

我的意思是EntityFramework.MicrosoftSqlServer 需要EntityFramework.Relational,这需要EntityFramework.Core

您应该另外验证global.json 是否包含"sdk": { "version": "1.0.0-rc1-update1" }

已更新:我检查了您上传的测试项目。它有很多小问题。我修改了它。您可以下载修改后的项目here不要忘记修复appsettings.json中使用的ConnectionString,它包含我在我使用的Server

最重要的变化是使用更简单的BookContext.cs

using Microsoft.Data.Entity;

namespace apiservice.Models {
    public class BookContext : DbContext {
        public DbSet<Author> Authors { get; set; }
        public DbSet<Book> Books { get; set; }
    }
}

下面SampleData.cs的用法

using System;
using System.Linq;
using Microsoft.Data.Entity;
using Microsoft.Extensions.DependencyInjection;

namespace apiservice.Models
{
    public static class SampleData
    {
        public static void Initialize(IServiceProvider serviceProvider) {
            var context=serviceProvider.GetService<BookContext>();
            context.Database.Migrate();
            if (!context.Books.Any()) {
                var austen = context.Authors.Add(
                    new Author { LastName = "Austen", FirstName = "Jane" }).Entity;
                var dickens = context.Authors.Add(
                    new Author { LastName = "Dickens", FirstName = "Charles" }).Entity;
                var cervantes = context.Authors.Add(
                    new Author { LastName = "Cervantes", FirstName = "Miguel" }).Entity;

                context.Books.AddRange(
                    new Book {
                        Title = "Pride and Prejudice",
                        Year = 1813,
                        Author = austen,
                        Price = 9.99M,
                        Genre = "Comedy of manners"
                    },
                    new Book {
                        Title = "Northanger Abbey",
                        Year = 1817,
                        Author = austen,
                        Price = 12.95M,
                        Genre = "Gothic parody"
                    },
                    new Book {
                        Title = "David Copperfield",
                        Year = 1850,
                        Author = dickens,
                        Price = 15,
                        Genre = "Bildungsroman"
                    },
                    new Book {
                        Title = "Don Quixote",
                        Year = 1617,
                        Author = cervantes,
                        Price = 8.95M,
                        Genre = "Picaresque"
                    }
                );

                context.SaveChanges(); 
            }
        }
    }    
}

project.json 与以下dependencies 部分的用法:

{
  "dependencies": {
    "Microsoft.AspNet.Diagnostics": "1.0.0-rc1-final",
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
    "Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
    "Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
    "Microsoft.Extensions.DependencyInjection": "1.0.0-rc1-final",
    "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
    "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final",
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "System.Net.Http": "4.0.1-beta-23516",
    "Microsoft.Net.Http": "2.2.29",
    "Newtonsoft.Json": "8.0.1"
  },
  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel",
    "ef": "EntityFramework.Commands"
  },
  "frameworks": {
    "dnx451": { },
    "dnxcore50": { }
  }
}

修复appsettings.json
{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Data": {
        "DefaultConnection":{
            "ConnectionString": "Server=localhost;Database=BookStore;User Id=sa; Password=******;Trusted_Connection=true;"
        }
    }
  }
}

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Verbose",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=localhost;Database=BookStore;User Id=sa; Password=******;Trusted_Connection=true;"
    }
  }
}

Data 不应不在Logging

以及下面Startup.cs的用法

using apiservice.Models;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Data.Entity;


namespace apiservice
{
    public class Startup
    {
        public static IConfigurationRoot Configuration {get; set;}

        public Startup(IHostingEnvironment env)
        {
            // Set up configuration sources.
            var builder = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json")
                .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
                .AddEnvironmentVariables();
            Configuration = builder.Build();
        }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddEntityFramework()
                .AddSqlServer()
                .AddDbContext<BookContext>(options => 
                    options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])
                );

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            // we need to execute the following two commands before

            //    dnu restore
            //    dnx ef migrations add Initial
            //    dnx ef database update   

            // For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859
            try
            {
                using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>()
                    .CreateScope())
                {
                    serviceScope.ServiceProvider.GetService<BookContext>()
                         .Database.Migrate();
                }
            }
            catch { }

            app.UseIISPlatformHandler();

            app.UseStaticFiles();

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

            SampleData.Initialize(app.ApplicationServices);
        }

        // Entry point for the application.
        public static void Main(string[] args) => WebApplication.Run<Startup>(args);
    }
}

我在Configure 方法内的评论中写道,应该执行命令

dnx ef migrations add Initial
dnx ef database update

在所有包都恢复之后。 dnx ef migrations add Initial 将在项目中创建额外的Migrations 文件夹,其中包含20160101205609_Initial.csBookContextModelSnapshot.cs 等文件。 appsettings.json 中定义的数据库将由dnx ef database update 创建,并在与程序分叉时填充来自SampleData.cs 的测试数据。

顺便说一句,我将package.json 移动到了包文件夹内(与project.json 在同一级别)。您不使用包,但移动使 npm 包在 Visual Studio 中可见和管理。

【讨论】:

  • 如果我理解正确,我现在有这个:"EntityFramework.Relational": "7.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer.Design": "7.0.0-rc1-final", "EntityFramework.Commands": "7.0.0-rc1-final" 即将出现的编译错误是:...The non-generic method 'IServiceProvider.GetService(Type)' cannot be used with type arguments...The non-generic method 'IServiceProvider.GetService(Type)' cannot be used with type arguments
  • 我忘了问,我在我的项目树中找不到 global.json。这是我正在使用 VS Code 开发的 Web API,项目使用 Yeoman 生成器生成。
  • @NiladriSarkar:您能否将您当前使用的完整的project.json 包括在内。如果您将测试项目上传到某个地方并且我可以在我的计算机上编译它,那将非常简单。我在回答中的意思是,如果您包含"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",您不需要包含EntityFramework.CoreEntityFramework.Relational - EntityFramework.MicrosoftSqlServer 的依赖项将自动加载。
  • 我可以通过电子邮件或其他方式将项目发送给您吗?我还没有可以上传的服务器!同时我删除了 .Core 和 .Relational 引用。但是,编译时仍然出现'IServiceProvider.GetService(Type)' cannot be used with type arguments 错误。
  • @NiladriSarkar:换句话说,可以说:ASP.NET 5 还不是最终版本,还有很多小问题。可以在项目目录的父目录中创建global.json 和可选的NuGet.config(不仅是%APPDATA%\NuGet\NuGet.config)。我建议您查看the video,这可能对您有所帮助。总的来说,现在支持project.json 真的不简单。我们可以希望它在未来会更简单。
猜你喜欢
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 2016-02-23
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多