Ошибка ASP.NET Core Web API: Модель 1 [TContext] нарушает ограничение типа 'TContext' - PullRequest
0 голосов
/ 19 января 2019

У меня есть решение в Visual Studio 2017, которое содержит следующие проекты:

CredentialManager.API (проект веб-API ASP.NET Core 2.1)

CredentialManager.Models (библиотека классов, содержащая модель домена и класс контекста данных)

Класс модели домена кодируется следующим образом:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace CredentialManager.Models.Entities
{
    public class Credential
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long CredentialId { get; set; }

        [Required]
        public string Username { get; set; }

        [Required]
        public string Password { get; set; }

        [Required]
        public string Application { get; set; }
    }
}

Класс контекста данных выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Text;
using CredentialManager.Models.Entities;
using Microsoft.EntityFrameworkCore;

namespace CredentialManager.Models.Context
{
    public class CredentialManagerContext : DbContext
    {

        public CredentialManagerContext(DbContextOptions options)
            : base(options)
        { }

        public DbSet<Credential> Credentials { get; set; }
    }
}

Файл appsettings.json выглядит следующим образом:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "i.": null,
    "CredentialManagerDB": "server=.\\SQLEXPRESS;database=CredentialManagerDB;Trusted_Connection=true;"
  },
  "AllowedHosts": "*"
}

Файл Startup.CS выглядит следующим образом:

// This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            services.AddDbContext<CredentialManagerContext>(o => o.UseSqlServer(Configuration["ConnectionStrings:CredentialManagerDB"]));

            // In production, the Angular files will be served from this directory
            services.AddSpaStaticFiles(configuration =>
            {
                configuration.RootPath = "ClientApp/dist";
            });
        }

Затем я строю решение и добавляю миграции. Но когда я запускаю update-database, я получаю следующую ошибку:

GenericArguments[0], 'CredentialManager.Models.Migrations.CredentialManagerContext', on 'Microsoft.EntityFrameworkCore.Design.IDesignTimeDbContextFactory`1[TContext]' violates the constraint of type 'TContext'.

Может кто-нибудь здесь пролить свет на эту ошибку? Если я включаю классы и контекст данных в ту же папку, что и проект API, то все работает .. Но я хочу, чтобы эти классы были частью отдельного проекта библиотеки классов. Любая помощь будет высоко ценится.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Спасибо за все предложения. Я также нашел решение. Startup.cs должен быть проинформирован о проекте, который содержит миграции:

services.AddDbContext<CredManagerContext>(options => options.UseSqlServer(Configuration.GetConnectionString("CredentialManagerDB"), x => x.MigrationsAssembly("CredManager.Models")));

После этого все работает отлично.

0 голосов
/ 20 января 2019

Обновите файл контекста, чтобы иметь следующее:

public CredentialManagerContext(DbContextOptions<CredentialManagerContext> options)
     : base(options)
{ }

Как указано в документации:

Это требует добавления аргумента конструктора к типу DbContext, который принимает:

DbContextOptions<TContext>

Это должно решить вашу проблему.

...