Модель, поддерживающая контекст <Database>, изменилась с момента создания базы данных


253

Сообщение об ошибке:

«Модель, поддерживающая контекст« Адресной книги », изменилась с момента создания базы данных. Либо удалите / обновите базу данных вручную, либо вызовите Database.SetInitializer с экземпляром IDatabaseInitializer. Например, стратегия RecreateDatabaseIfModelChanges автоматически удалит и заново создаст базу данных, и опционально заполнить его новыми данными. "

Я пытаюсь использовать функцию кода в первую очередь, и вот что я написал:

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

Контекстный класс:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

и строка подключения:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

Итак, имя базы данных - «Адресная книга», и возникает ошибка, когда я пытаюсь добавить объект контакта в контекст. Я что-то здесь упускаю?



Удалите таблицу __MigrationHistory из своей базы данных
Захид Хасан

Ответы:


397

Теперь это:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

в вашем файле YourDbContext.cs.


Я изменил свою производственную базу данных вручную и отключил миграцию, и это работает, спасибо
Мохсен Афшин

13
Ps, это идет в Global.asax Application_Start ()
BritishDeveloper

48
Лучше, чем Global.asax, поместить это в конструктор вашего класса DbContext. Таким образом, он работает для каждого сайта, использующего контекст, а не только для одного сайта, контролируемого файлом Global.asax.
Корин

7
Вероятно, лучше всего поместить его в статический конструктор класса контекста, чтобы он вызывался только один раз - как в этом примере видео: msdn.microsoft.com/en-us/data/jj572367
Кристиан Фред,

3
Он должен быть помещен внутрь защищенного переопределения void OnModelCreating (DbModelBuilder modelBuilder) {Database.SetInitializer <YourDbContext> (null); base.OnModelCreating (MODELBUILDER); }
Крис Воон

135

Вот некоторая информация из блога Скотта Гу, опубликованного Джеффом, о том, что на самом деле происходит:

Для тех, кто видит это исключение:

«Модель поддержав„Производство“контекст изменился , так как база данных была создана. Либо вручную удалить / обновить базу данных, или вызов Database.SetInitializerс IDatabaseInitializerэкземпляром.»

Вот что происходит и что с этим делать:

Когда модель впервые создается, мы запускаем DatabaseInitializer, чтобы создать такие вещи, как создание базы данных, если ее там нет, или добавить начальные данные. DatabaseInitializer по умолчанию пытается сравнить схему базы данных, необходимую для использования модели, с хешем схемы, хранящейся в таблице EdmMetadata, которая создается с базой данных (когда Code First создает базу данных). Существующие базы данных не будут иметь таблицы EdmMetadata и, следовательно, не будут иметь хеша… и реализация сегодня выдаст, если эта таблица отсутствует. Мы будем работать над изменением этого поведения до того, как отправим конечную версию, поскольку она используется по умолчанию. До этого момента существующие базы данных обычно не нуждаются в инициализаторе базы данных, поэтому его можно отключить для вашего типа контекста, вызвав:

Database.SetInitializer<YourDbContext>(null);

Джефф


9
Я попробовал это сегодня, и я больше не получаю «Модель изменилась», вместо этого я получаю «Неверное имя объекта« dbo.Table »»
Стефан Бергфельдт

3
Джефф хотел, чтобы это был обходной путь, но с тех пор прошло более двух лет, и SetInitializer для обнуления все еще требуется. право? Кто-то может объяснить, как это вписывается в рабочий процесс миграции.
Кроиз

2
@jakejgordon: Я тоже с EF6, но если он находится в Global.asax, это только решает проблему при запуске сайта. Если у вас есть юнит-тесты, вы OOL. Лучше поместить его в конструктор YourDbContext. Это исправляет это для каждого проекта, включая веб-сайт и тестовые проекты.
Рэп

1
ИМО, этот ответ должен быть оценен выше, поскольку он фактически объясняет, почему мы должны добавить эту строку кода. Спасибо.
Пол

1
@StefanBergfeldt, если вы или кто-либо другой получили Invalid object name 'dbo.Tableпроверку вашей строки подключения attachDbFilename и начального каталога
benscabbia

41

Для Entity Framework 5.0.0.0 - 6.1.3

Вы DO действительно хотите сделать следующее:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

Да, Мэтт Фрир прав. ОБНОВЛЕНИЕ -EDIT: Предостережение в том, что я согласен с другими в том, что вместо добавления этого кода в global.asax, добавляемый в ваш класс DbContext

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

Как уже упоминалось, это также хорошо для тестирования модулей.

В настоящее время я использую это с Entity Framework 6.1.3 /.net 4.6.1

Я вернусь, чтобы предоставить фрагмент кода в ближайшем будущем.


1
Спасибо! Program.cs определенно работает для консолей.
HockeyJ,

Но когда вы впервые инициализируете свою базу данных, она не создает базу данных, если я положил setinitializer null в метод onModelCreating. Есть предположения ? Eventhoug я использую (var context = Activator.CreateInstance <TContext> ()) {context.Database.Initialize (true); }
Рупеш Кумар Тивари

Мне нужно найти свой код, который я бы использовал, чтобы иногда закомментировать строку и поменять местами ... Я не вспоминаю о проблеме, мне нужно посмотреть.
Том Стиккель

1
Лучшее решение Это заставляет мое решение работать, и я понятия не имею, каковы последствия. Зафиксируйте и разверните.
Свен


31

Это исправление больше не работает после CTP5.

Ты должен сделать Database.SetInitializer<YourContext>(null);


1
Куда это идет ... У OnModelCreating нет ничего доступного под названием DbDatabase
James Reategui

Где-то при запуске я установил мой в Application_Start.
chrisortman

Кажется, что Database.SetInitializer отлично работает в финальной версии EF 4.3.
Ричард Бейер

Я предполагаю, что «Это исправление больше не работает после CTP5» означает, что он принимает ответ «Принято» от 30 августа 2010 года.
Том Стиккель

19

Просто узнал ответ и подумал об обновлении здесь. Просто нужно сделать следующее.

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}

12
Это более невозможно с более поздними версиями EF, также modelBuilder.Conventions.Remove<IncludeMetadataConvention>();не помогает ситуация. DbDatabase.SetInitialzer (нуль); работает.
JTew

@ TomStickel - согласен. Отмеченный stackoverflow.com/a/6143116/255562 в качестве ответа.
Ашиш Гупта

16

Или вы можете поместить эту строку в свой файл Global.asax.cs в Application_Start ():

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

Убедитесь, что изменили ProjectName.Path.Context на ваше пространство имен и контекст. Если сначала использовать код, это приведет к удалению и созданию новой базы данных при каждом изменении схемы.


Именно то, что мне было нужно, так как я занимался только прототипированием. Большое спасибо.
ученик

8

Я потратил много дней, чтобы решить эту проблему, проанализировал много разных постов, перепробовал много вариантов и, наконец, исправил. Это 2 проекта в моем решении с использованием кода EF для первой миграции:

  • Консольное приложение «DataModel», которое в основном используется в качестве сборки, которая содержит весь мой код первых сущностей, DbContext, Mirgations и универсальный репозиторий. Я включил в этот проект отдельный пустой файл локальной базы данных (в папке DataModel / App_Data), чтобы иметь возможность генерировать миграции из консоли диспетчера пакетов.
  • WebApi, который ссылается на проект DataModel и использует файл локальной базы данных из папки WebApi / App_Data, который не включен в проект

Я получил эту ошибку при запросе WebApi ...

Моя среда:

  • Windows 8.1 x64
  • Visual Studio 2015 Professional с обновлением 1
  • все мои проекты ориентированы на .NET Framework 4.6.1
  • EntityFramework 6.1.3 от NuGet

Здесь я собрал все замечания, на которые следует обратить внимание, и все условия / требования, которые должны быть выполнены, чтобы избежать упомянутого исключения:

  1. Вы должны использовать только одну версию пакета EntityFramework Nuget для всех проектов в вашем решении.
  2. База данных, созданная путем последовательного запуска всех сценариев миграции, должна иметь ту же структуру / схему, что и целевая база данных, и соответствовать модели сущностей. Следующие 3 вещи должны точно соответствовать / отражать / соответствовать друг другу:
    • Ваш весь сценарий миграции до последнего
    • Текущее состояние первой модели сущности кода (DbContext, сущности)
    • Целевая база данных
  3. Целевая база данных (файл mdf) должна быть обновлена ​​/ соответствовать последнему сценарию миграции. Убедитесь, что таблица «__MigrationHistory» в целевой базе данных содержит записи для всех имеющихся у вас сценариев миграции, это означает, что все сценарии миграции были успешно применены к этой базе данных. Я рекомендую вам использовать Visual Studio для генерации правильного кода первых сущностей и контекста, соответствующего вашей базе данных, Project -> Добавить новый элемент -> ADO.NET Entity Data Model -> Code First из базы данных: конечно, в качестве альтернативы, если у вас нет базы данных, вы можете написать вручную модель (сначала кодировать сущности и контекст), а затем сгенерировать начальную миграцию и базу данных.
  4. Имя строки подключения, например, MyConnectionString в файле конфигурации запускаемого проекта (Web.config / App.config):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>

    должен быть равен параметру, переданному в конструкторе вашего DbContext:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
  5. Прежде чем использовать Консоль диспетчера пакетов , убедитесь, что вы используете правильную базу данных для обновления или создания миграции, и необходимый проект задан как стартовый проект решения. Для подключения к базе данных он будет использовать строку подключения из того файла .config, который в проекте установлен как стартовый проект.
  6. И главное, что решило мою проблему: это странно, но в моей папке WebApi / bin DataModel.exe был старым, не обновленным с момента последней сборки. Так как миграции были встроены в мою сборку DataModel.exe, тогда моя WebApi обновила базу данных, используя старые зеркала. Меня смутило, почему после обновления базы данных в WebApi она не соответствует последнему скрипту миграции из DataModel. Следующий код автоматически создает (если не существует) или обновляет локальную базу данных последней миграции в моей папке WebApi / App_Data.

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...

    Я попытался очистить и перестроить решение, но оно не помогло, чем полностью удалил папки bin и obj из WebApi, удалил файлы базы данных из WebApi / App_Data, собрал, перезапустил WebApi, сделал запрос к нему, он создал правильную базу данных - ленивая инициализация (используя строки выше), что соответствует последней миграции и исключение больше не появлялось. Итак, это может решить вашу проблему:

    1. удалите папки bin, obj вручную из вашего проекта запуска (который генерирует / обновляет вашу базу данных)
    2. Создайте свой проект запуска или лучше очистите и восстановите все, что вам нужно.
    3. воссоздать базу данных, запустив проект (выполнит строки выше) или используя команду update-database на консоли диспетчера пакетов.
    4. вручную проверьте, соответствуют ли сгенерированные базы данных и __MirgationHistory последнему сценарию миграции.

5

Для меня с обновлением до 4.3.1 я просто усекаю таблицу EdmMetaData или просто удаляю ее напрямую.


Я обновил до 4.3.1, а затем просто переименовал таблицу EdmMaetaData. Теперь я могу вносить изменения в модель по мере необходимости, и больше не надоедающие сообщения об ошибках в поддержку модели бла-бла-бла.
Ашок Падманабхан

3

Для разработчиков VB.NET:

Добавьте следующую строку в файл Glabal.asax.vb в конце метода Application_Start ()

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

Измените ApplicationDbContext на ваш конкретный контекст БД.


2

У меня была эта проблема, и оказалось, что один проект указывал на SQLExpress, а другой - на LocalDb. (в соответствующем web.config). Глупый надзор, но стоит отметить, что если кто-то еще устраняет эту проблему.


2

Это означает, что в контексте произошли некоторые изменения, которые не были выполнены. Пожалуйста, сначала запустите Add-Migration, чтобы сгенерировать изменения, которые мы сделали (изменения, которые мы могли бы не знать), а затем запустите Update-Database


2

У меня была та же самая проблема - повторное добавление миграции и обновление базы данных не работало, и ни один из ответов выше не казался правильным. Затем меня поразило вдохновение - я использую несколько уровней (один веб, один данные и один бизнес). Уровень данных имеет контекст и все модели. Веб-уровень никогда не создавал этого исключения - это был бизнес-уровень (который я установил как консольное приложение для тестирования и отладки). Оказывается, бизнес-уровень не использовал правильную строку соединения, чтобы получить базу данных и создать контекст. Поэтому я добавил строку подключения в конфигурацию приложения бизнес-уровня (и уровня данных) и сделал это. Положите это здесь для тех, кто может столкнуться с той же проблемой.


1

Я использую метод Database.CompatibleWithModel (доступный в EF5), чтобы проверить, соответствуют ли модель и БД, прежде чем я его использую. Я вызываю этот метод сразу после создания контекста ...

        // test the context to see if the model is out of sync with the db...
        if (!MyContext.Database.CompatibleWithModel(true))
        {
            // delete the old version of the database...
            if (File.Exists(databaseFileName))
                File.Delete(databaseFileName);
            MyContext.Database.Initialize(true);

            // re-populate database

        }

1

Хорошее предложение, однако, не так точно во всех случаях. Я понял один. Пожалуйста, убедитесь, что вы запускаете «enable-migrations», используя окна PM в Visual Studio, и папка Migration будет добавлена ​​в ваш проект.

Убедитесь, что два файла класса c #, добавленные в папку, будут содержать все ваши модели и их соответствующие свойства.

Если у вас есть все это, создайте решение и опубликуйте его для развертывания.

Логика заключается в том, что существующие метаданные не могут быть перезаписаны, поскольку в вашем приложении нет метаданных для замены текущих. В результате вы получаете эту ошибку «Модель, поддерживающая контекст, изменилась с момента создания базы данных»


1

На всякий случай, если у кого-то такой же сценарий, как у меня.

У меня есть база данных EF и в то же время с использованием идентичности asp.net

поэтому в моем webconfig есть две строки подключения, и с этим проблем нет. Случилось так, что я создал / запустил скрипты для генерации вручную таблиц идентификации asp.net, чего не следует делать.

поэтому сначала удалите все таблицы идентификаторов asp.net, созданные вами вручную / из сценариев.

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers

1

Ни одно из этих решений не будет работать для нас (кроме полного отключения проверки схемы). В итоге у нас был промах в нашей версии Newtonsoft.json

Наш AppConfig не был обновлен правильно:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>

Решение состояло в том, чтобы исправить версию сборки на ту, которую мы фактически развертывали

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
  </dependentAssembly>

У нас была похожая проблема с версией Newtonsoft.json, когда мы обновляли версию, проблема была решена.
Руи

0

После некоторых исследований по этой теме я обнаружил, что ошибка возникает в основном, если у вас есть экземпляр db, созданный ранее на вашем локальном сервере sql express. Поэтому всякий раз, когда у вас есть обновления на БД и вы пытаетесь обновить БД / запускать некоторый код на БД без запуска Update Databaseкоманды using Package Manager Console; Прежде всего, вы должны удалить предыдущие БД на нашем локальном SQL Express.

Кроме того, это решение работает, если у вас нет AutomaticMigrationsEnabled = false;в вашей конфигурации.

Если вы работаете с системой контроля версий (git, svn и т. Д.) И некоторые другие разработчики обновляют объекты db на этапе разработки, то эта ошибка возникает всякий раз, когда вы обновляете базу кода и запускаете приложение.

Как указано выше, есть несколько решений для этого на основе кода. Однако это наиболее практичный вариант для некоторых случаев.


0

Я также читаю книгу Pro ASP.NET MVC 4 и столкнулся с той же проблемой, что и вы. У меня возникла проблема после внесения изменений, предписанных в разделе «Добавление проверки модели» книги. Я решил проблему, переместив свою базу данных с локальной базы данных на полноценный сервер SQL Server 2012. (Кстати, я знаю, что мне повезло, что я мог перейти на полноценную версию, так что не ненавидите меня. ;-))) Должно быть что-то в связи с базой данных, которая вызывает проблему.


Откуда вы знаете, что это связь с БД, а не, например, ее метаданные?
флоп

2
Извините за поздний ответ. Оказывается, это совсем не проблема общения! Воссоздание БД просто замаскировало проблему, потому что у меня снова возникла та же проблема! __Migrationxxx (не могу вспомнить точное имя таблицы, потому что я только что удалил ее) создается ef. Просто удалите его, и у вас все будет хорошо.
J3 говорит

@ MyJ3 Все люди, изрыгающие все эти чертовы строки и строки кода. Это все, что мне было нужно! Заслуживает ответа (необязательный сценарий).
Terrance00

@ Terrance00 Спасибо!
J3 говорит

0

Проверьте это следующие шаги

  1. Database.SetInitializer (нуль); -> в Global.asax.cs

2.

  1. Ваше имя класса Context должно совпадать с проверкой

0

Изменить Global.asax.cs, в том числе Application_Startсобытие с:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());

5
Я был бы немного яснее о том, что это делает, лично.
Кейси

3
НЕТ НЕТ НЕТ, я не хочу использовать DropCreateDatabaseIfModelChanges 99% времени!
Том Стиккель

0

Эта ошибка может указывать на проблему со строкой подключения и на то, соответствует ли имя строки подключения объявлению контекста базы данных.

У меня была эта ошибка, потому что я неправильно назвал локальную базу данных (глупая ошибка), а имя строки подключения в web.config «DefaultConnection» не совпадает с MyDbContext, т.е.

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>

0

Попробуйте использовать базу данных SetInitializer, которая относится к использованию System.Data.Entity;

В Global.asax

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

Это будет создавать новую базу данных каждый раз, когда ваша модель будет изменена. Но ваша база данных будет пустой. Чтобы заполнить ее фиктивными данными, вы можете использовать Seeding. Что вы можете реализовать как:

Посев ::

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}

0

Это странно, но все ответы здесь были для меня бесполезны. У меня работал инициализатор

MigrateDatabaseToLatestVersion

Вот мое решение (я знаю, это может быть намного проще, но это то, как я его использую):

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

MyDbInitializerForTesting просто наследуется от DropCreateDatabaseAlways, поэтому в некоторых конкретных случаях (тестирование) вся база данных перестраивается. В противном случае он переносится на последнюю версию.

Мой источник: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific


0

У меня была такая же проблема, когда мы использовали одну базу данных для двух приложений. Настройка disableDatabaseInitialization="true"в разделе типа контекста работает для меня.

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

Подробнее см. Https://msdn.microsoft.com/en-us/data/jj556606.aspx.


0

Создайте пользовательский контекстный инициализатор:

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

Обратите внимание, что Migrations.Configuration - это класс, генерируемый командной строкой миграции в консоли диспетчера пакетов. Вам может потребоваться изменить внутренний на публичный модификатор класса Migrations.Configuration.

И зарегистрируйте его в своем OmModelCreating:

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}

-1

Здесь я хочу поделиться другим методом, который предотвращает ошибку поддержки модели при изменении контекста:

1) Откройте файл DbContext

2) Добавить пространство имен, используя Microsoft.AspNet.Identity.EntityFramework;

3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (new DropCreateDatabaseAlways ()); }

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.