сделать tnet веб-сервис и тесты: удаление базы невозможно, так как база уже используется - PullRequest
0 голосов
/ 17 января 2020

Я создал в visual studio веб-проект ASP. NET, в который я добавил файл asmx, чтобы преобразовать его в веб-сервис. Это сработало. Я также создал модельный проект, в котором для создания базы данных используется структура сущностей, экземпляр SQL server express (не локальная база данных). наконец, я создал тестовый проект, который содержит все мои модульные тесты.

Цель веб-сервиса - прочитать базу данных и ответить на запросы, предоставив вызывающей стороне содержимое базы данных.

In чтобы очистить базу данных и разрешить повторяющиеся тесты, мне нужно очистить базу данных; для этого я создал класс, унаследованный от DropCreateDatabaseAlways.

Решение может быть построено, но когда я запускаю тест, мне советуют удалить базу данных Market, поскольку она уже используется. , Хотя я закрыл SqlServer Management Studio, проблема остается. Я думаю (спасибо, чтобы подтвердить), проблема возникает из той же строки подключения к базе данных, используемой в веб-сервисе, в проекте модели и в тестовом проекте. Я могу быть открыт несколько раз и генерирует эту ошибку.

Как правильно очистить базу данных? (Не SQL заявления, пожалуйста).

Вот некоторые файлы:

во-первых, файл MarketContext:

namespace Model.EntityFrameworkHelperClasses
{
    public class MarketContext : DbContext
    {
        //public MarketContext() : base("name=sqlserver") { }
        public MarketContext(DbConnection conn) : base(conn,false) { }


        public virtual DbSet<Magasin> Magasins { set; get; }

        public virtual DbSet<ProduitMagasin> ProduitsMagasin { set; get; }

        public virtual DbSet<Rayon> Rayons { set; get; }




    }
}

Метод веб-службы, который обеспечивает содержание базы данных для вызывающего абонента:

    [WebMethod]
    public List<Magasin> getMagasins()
    {
        //récupération en base
        DbSet<Magasin> dbMagasins = null;
        List<Magasin> magasins = new List<Magasin>();

        var conn = new SqlConnection("Data Source=DESKTOP-5J321S5\\SQLEXPRESS;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;;Initial Catalog=Market;Pooling=false");
        conn.Open();

        using (var ctx2 = new MarketContext(conn))
        {
            dbMagasins = ctx2.Magasins;
            foreach (var mg in dbMagasins)
            {
                magasins.Add(mg);
            }
        }

        return magasins;
    }

next, часть web.config в веб-службе ' project:

<entityFramework>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="sqlserver" connectionString="Data Source=DESKTOP-5J321S5\SQLEXPRESS;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;;Initial Catalog=Market;Pooling=false" providerName="System.Data.SqlClient"/>
  </connectionStrings> 

эта же часть включена в файл App.config в проекте модели и в тестовом проекте.

последний, но не менее важный тестовый файл в Тестовый проект:

namespace Tests
{
    [TestClass]
    public class TestsWebService
    {
        Market5.market Service5 = null;


        [TestInitialize]
        public void setUp()
        {
            //récupération du service
            Service5 = new Market5.market();

            //remplissage de la base

            var conn = new SqlConnection("Data Source=DESKTOP-5J321S5\\SQLEXPRESS;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;;Initial Catalog=Market;Pooling=false");
            conn.Open();
            using (var ctx = new MarketContext(conn))
            {
                //vidage tout d'abord
                new MyDataInitializer().InitializeDatabase(ctx);

                //puis remplissage
                var produitMagasin1 = new ProduitMagasin() { Nom = "Pommes", Quantite = 10 };
                var produitMagasin2 = new ProduitMagasin() { Nom = "Poires", Quantite = 5 };
                var rayon1 = new Rayon() { Nom = "fruits & légumes", Produits = new List<ProduitMagasin>() { produitMagasin1, produitMagasin2 } };
                var magasin1 = new Magasin() { Rayons = new List<Rayon>() { rayon1 } };

                ctx.Magasins.Add(magasin1);
                ctx.SaveChanges();

            }



        }


        [TestMethod]
        public void testBaseConstruiteDansSetUp()
        {


            //int result5 = service5.Multiply(2, 5);
            //Assert.AreEqual(10, result5);
            Market5.Magasin[] magasins = Service5.getMagasins();
            //Assert.AreEqual(1, sm.Magasins.Length);
            Assert.AreEqual(2, magasins[0].Rayons[0].Produits.Length);


        }




    }
}

и, наконец, класс инициализатора данных:

namespace Model.EntityFrameworkHelperClasses
{
    public class MyDataInitializer : DropCreateDatabaseAlways<MarketContext>
    {
        public override void InitializeDatabase(MarketContext context)
        {
            context.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction
                , string.Format("ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE", context.Database.Connection.Database));

            base.InitializeDatabase(context);
        }

        protected override void Seed(MarketContext context)
        {
            base.Seed(context);

        }




    }
}

Первый вопрос: как избавиться от этого сообщения об ошибке?

спасибо Вы.

РЕДАКТИРОВАТЬ: я забыл указать, я опубликовал веб-сервис для IIS express, на windows 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...