Реляционное хранилище настроено без указания DbConnection или строки подключения для использования.

Я использую asp.net vnext и ef7, когда хочу добавить пользователя, я получаю эту ошибку:

Реляционное хранилище настроено без указания используемого DbConnection или строки подключения.

Что это?

Рассмотрим запуск моего приложения:

using DomainModels;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Routing;
using Microsoft.Framework.ConfigurationModel;
using Microsoft.Framework.DependencyInjection;
using Presentation.DataAccessLayer.Context;
using Microsoft.AspNet.Identity;
namespace Presentation
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            Configuration = new Configuration()
                .AddJsonFile("config.json")
                .AddEnvironmentVariables();
        }

        public IConfiguration Configuration { get; set; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddEntityFramework().AddSqlServer().AddDbContext<ApplicationContext>();
            services.AddDefaultIdentity<ApplicationContext, ApplicationUser, IdentityRole>(Configuration);
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseStaticFiles();
            app.UseIdentity();
            app.UseMvc(
                routes =>
                {
                    routes.MapRoute("default", "{controller}/{action}/{id?}",
                        new {controller = "Home", action = "Index"});
                });
        }
    }
}

и это мой config.json:

{
    "Data": {
        "DefaultConnection": {
            "Connectionstring": "Data Source=.\\sqlexpress;Initial Catalog=CraftCenter;Integrated Security=True;"
        }
    },
    "EntityFramework": {
        "ApplicationDbContext": {
            "ConnectionStringKey": "Data:DefaultConnection:ConnectionString"
        }
    }

}

person Community    schedule 28.12.2014    source источник


Ответы (5)


Я думаю, проблема заключалась в том, что имя вашего класса DbContext не совпадает с именем, указанным в вашей конфигурации.

Например, если у вас есть DbContext с именем MembershipDbContext, вы можете указать строку подключения, которую он должен использовать, через свойства внутри EntityFramework.

{
"Data": {
    "Membership": {
        "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Membership;Trusted_Connection=True;MultipleActiveResultSets=true"
    }
},
"EntityFramework": {
    "MembershipDbContext": {
        "ConnectionStringKey": "Data:Membership:ConnectionString"
    }
}

Это чище, чем указание ключей строки подключения в коде.

В вашем случае имя DbContext — ApplicationContext, а имя, указанное вами в конфигурации, — ApplicationDbContext, которые не совпадают.

person kowsheek    schedule 20.02.2015
comment
Этот. Чистый гений, я даже не заметил, что имя соответствует контексту, и поскольку я переместил его (контекст) в другую dll и переименовал, это было мое недостающее звено. Спасибо. - person Vassi; 28.02.2015

"EntityFramework": {
    "MembershipDbContext": {
        "ConnectionStringKey": "Data:Membership:ConnectionString"
    }
}

Изменение ConnectionStringKey на ConnectionString работает для меня.

person Huson    schedule 02.03.2015

Я предпочитаю настраивать хранилище в классе Setup:

public virtual void ConfigureServices(IServiceCollection services)
{
    services.AddEntityFramework()
            .AddSqlServer()
            .AddDbContext<ApplicationContext>(options => options.UseSqlServer(
                Configuration.Get("Data:DefaultConnection:ConnectionString")));
     services.AddDefaultIdentity<ApplicationContext, ApplicationUser, IdentityRole>(Configuration);
     services.AddMvc();
}
person agua from mars    schedule 05.01.2015
comment
Разве это не должно работать без каких-либо изменений, поскольку это определено в файле config.json? - person Shawn Wildermuth; 11.01.2015
comment
Я бы предпочел использовать этот метод по сравнению с принятым ответом, поскольку он оставляет конфигурацию в классе Startup, однако я получаю сообщение об ошибке, что он недоступен в ASP.NET Core 5.0. (приложение отлично работает без него, но строительные леса лают на меня из-за того, что я не указываю ни DbConnection, ни строку подключения для использования) - person Matt Sanders; 03.02.2015

Я получаю это и добавляю этот код в свой контекст:

  protected override void OnConfiguring(DbContextOptions options)
        {
            options.UseSqlServer(Startup.Configuration.Get("Data:DefaultConnection:ConnectionString"));
        }
person Community    schedule 28.12.2014
comment
Это не имеет смысла. Если это в классе контекста, Startup не является статическим классом. - person Shawn Wildermuth; 11.01.2015
comment
Я столкнулся с той же проблемой, что и Шон, где это не статический класс. - person Matt Sanders; 03.02.2015
comment
Вы вообще получили чистое решение для этого? Возникла та же проблема при добавлении DbContext в отдельный проект в решении. - person Oli; 06.02.2015
comment
Ответ @aredkid ниже гораздо предпочтительнее, оставляя конфигурацию в веб-проекте и конкретно вне контекста. Я также переместил DbContext в другую сборку и переименовал его и никогда не замечал, что файл config.json пытается сопоставить его по имени (вероятно, для поддержки сценариев с несколькими контекстами). - person Vassi; 28.02.2015

Он ищет строку подключения в DbContext, поэтому вам нужно изменить «ConnectionStringKey» на «ConnectionString» в config.json.

person Fred    schedule 24.02.2015