Как мне создать базу данных, если она отсутствует?
Using Microsoft.EntityFrameworkCore
В EF6 я мог бы использовать
Database.SetInitializer<apiDBContext>(new CreateDatabaseIfNotExists<apiDBContext>());
Я нашел способ, но не уверен, что он лучший .
Следующий тест не пройден
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Dogs;
namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
Helper.SanityCheck();
}
}
}
Источники кода
public class apiDbContext : DbContext
{
public apiDbContext(DbContextOptions<apiDbContext> options)
: base(options)
{
}
public DbSet<poodle> Poodles { get; set; }
}
и
public class poodle
{
public poodle() { }
public int Id { get; set; }
public string Name { get; set; }
}
и
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