dotnet aspnet-codegenerator失败,消息显示已找到多个具有相同名称的DbContext。但我的项目只有一个

时间:2018-04-03 15:27:07

标签: c# .net-core

我有一个Host类

namespace Trivia.Models
{
    public class Host
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int SettingId { get; set; }
        //public HostSetting Setting { get; set; }
    }
}

上下文

using Microsoft.EntityFrameworkCore;

namespace Trivia.Models
{
    public class TriviaDbContext : DbContext
    {
        public TriviaDbContext(DbContextOptions<TriviaDbContext> options) 
            : base(options)
        {
        }

        public DbSet<Host> Host { get; set; }
    }
}

以下行添加到ConfigureServices方法的类Startup

services.AddDbContext<TriviaDbContext>(options =>
                                                   options.UseSqlite("Data Source=Trivia.db"));

运行以下命令

  

dotnet aspnet-codegenerator controller -name HostsController -m Host   -dc TriviaDbContext --relativeFolderPath控制器--useDefaultLayout --referenceScriptLibraries

给出以下错误

  

构建项目......查找生成器&#39;控制器&#39; ...运行   generator&#39; controller&#39; ...尝试编译应用程序   记忆。试图弄清楚EntityFramework的元数据   model和DbContext:&#39; Host&#39; :   Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager [0]         用户个人资料可用。使用&#39; /Users/path/.aspnet/DataProtection-Keys'作为密钥库;   密钥在休息时不会被加密。多个DbContext命名   &#39; Trivia.Models.TriviaDbContext&#39;被找到。指定要使用的是哪一个   使用其确切的案例提供其完全限定的名称。堆栈跟踪:
  在   Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.FindContextType(字符串   姓名)at   Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(字符串   contextType)at   Microsoft.VisualStudio.Web.CodeGeneration.EntityFrameworkCore.EntityFrameworkModelProcessor.TryCreateContextUsingAppCode(类型   dbContextType,Type startupType)

     

多个DbContext名为&#39; Trivia.Models.TriviaDbContext&#39;是   找到。通过提供其完全限定名称来指定要使用的名称   使用其确切的情况。在   Microsoft.VisualStudio.Web.CodeGeneration.ActionInvoker.b__6_0()   在   Microsoft.Extensions.CommandLineUtils.CommandLineApplication.Execute(字符串[]   args)at   Microsoft.VisualStudio.Web.CodeGeneration.ActionInvoker.Execute(字符串[]   args)at   Microsoft.VisualStudio.Web.CodeGeneration.CodeGenCommand.Execute(字符串[]   args)RunTime 00:00:11.61

我没有多个数据库上下文。

我的program.cs文件

public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                //.UseStartup<Startup>()
                   .UseStartup(typeof(Startup).Assembly.FullName)
                .Build();
    }

取消注释// .UseStartup()使应用程序正常工作。

我仍然希望应用程序根据我的环境使用StartupDevelopment,并使用dotnet aspen-codegenerator工作。

2 个答案:

答案 0 :(得分:0)

不使用StartupDevelopment,而是使用ConfigureDevelopmentServices并在那里设置环境

$color-map: (
  'b': #000,
  'f': orange,
  's': darken(#{f}, 50%), //not working, any ideas?
);

优势

  1. 无需使用Startup {Enviornmentname}类
  2. 无需修改program.cs
  3. 使用dotnet aspnet-generator
  4. 这种方法比在ConfigureServices方法中使用if / else条件要好得多。

答案 1 :(得分:0)

像我这样指定上下文。在dotnetcore 3.0中

dotnet ef migrations add IntialCreate  --project .\Persistence\ -s .\API\  --context DataContext