Login failed for user ( with trusted connection EF Core) How do I create missing database?

-1

How do I create a database if it is missing ?

Using Microsoft.EntityFrameworkCore

In EF6 I could use

 Database.SetInitializer<apiDBContext>(new CreateDatabaseIfNotExists<apiDBContext>());

I found a way but am not sure if it is the best.

The following test fails

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Dogs;
namespace UnitTestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
             Helper.SanityCheck();
        }
    }
}

Code sources

public class apiDbContext  :  DbContext  
{
    public apiDbContext(DbContextOptions<apiDbContext> options)
        : base(options)
    {
    }
    public DbSet<poodle> Poodles { get; set; }
}

and

public class poodle
{
    public poodle() { }
    public int Id { get; set; }
    public string Name { get; set; }
}

and

using System;
using System.Linq;
using Dogs.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
namespace Dogs
{
    public static class Helper {
        public static void SanityCheck()
        {
            try
            {
                using var db = Helper.MakeContext();
                var num = db.Poodles.Count() + 1;
                var poodle = new poodle {Name = $"Fluffy{num}"};
                db.Poodles.Add(poodle);
                db.SaveChanges();
                Console.WriteLine(poodle == null ? "No dog" : $"We have {poodle.Name}");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
               // MakeDatabase();
            }
        }

        public static apiDbContext MakeContext()
        {
                var builder = new ConfigurationBuilder();
                builder.AddJsonFile("appsettings.json");
                var config = builder.Build();
                var connectionString = config.GetConnectionString("MyDatabase");
                var optionsBuilder = new DbContextOptionsBuilder<apiDbContext>();
                optionsBuilder.UseSqlServer(connectionString, options => options.EnableRetryOnFailure());
                var options = optionsBuilder.Options;
                var db = new apiDbContext(options);
            //  db.Database.EnsureCreated();
                return db;
        }
    }
}

Stack Trace

Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot open database "MyDogs" requested by the login. The login failed.
Login failed for user 'MyComputer\kirst'.
   at Microsoft.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken, DbConnectionPool pool, SqlAuthenticationProviderManager sqlAuthProviderManager)
   at Microsoft.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at Microsoft.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at Microsoft.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at Microsoft.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at Microsoft.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at Microsoft.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at Microsoft.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at Microsoft.Data.SqlClient.SqlConnection.Open()
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)
   at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementation[TState,TResult](Func`3 operation, Func`3 verifySucceeded, TState state)
   at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
   at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
   at System.Linq.Queryable.Count[TSource](IQueryable`1 source)
   at Dogs.Helper.SanityCheck() in D:\Users\kirst\source\repos\Dogs\Helper.cs:line 14
ClientConnectionId:7553d6b2-3523-4b61-ad2f-37195f11bdea
Error Number:4060,State:1,Class:11
sql-server
entity-framework-core
asked on Stack Overflow Mar 31, 2020 by Kirsten Greed • edited Mar 31, 2020 by Kirsten Greed

1 Answer

1

One solution is to uncomment

db.Database.EnsureCreated()

Is there a better way, similar to EF6's Database.SetInitializer ?

answered on Stack Overflow Mar 31, 2020 by Kirsten Greed • edited Mar 31, 2020 by Kirsten Greed

User contributions licensed under CC BY-SA 3.0