Я создал в 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.