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

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

«Модель, поддерживающая контекст 'AddressBook', изменилась с момента создания базы данных. Либо вручную удалите / обновите базу данных, либо вызовите 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>

Итак, имя базы данных - " com / questions / 2682613 / cant-set-breakpoints-on-an-auto-property-setter-why / 6713920 # 6713920

19
задан Rookian 6 June 2017 в 09:13
поделиться

5 ответов

Если у вас есть контроль над кодом, объявляющим свойство, то, конечно же, вы можете поставить точку останова внутри установщика. Даже если в настоящее время это свойство реализуется автоматически, например:

public string SomeProperty { get; set; }

вы можете легко изменить его следующим образом:

private string _someProperty;
public string SomeProperty {
    get { return _someProperty; }
    set {
        // Set breakpoint here, or type Debugger.Break();
        _someProperty = value;
    }
}

Если значение на самом деле является полем вместо свойства , вы все равно можете изменить его на свойство, чтобы добиться того же.

Если у вас нет доступа к коду, объявляющему свойство, то это немного сложнее. Лично я делаю вот что, но это немного трудоемко:

  1. Объявите общедоступное статическое поле в вашем классе Program того типа, который объявляет свойство.

  2. В начале программы найдите ссылку на объект, значение свойства которого изменяется, и поместите эту ссылку в это статическое поле. При необходимости используйте Reflection для получения закрытых полей.

  3. Добавьте global::MyNamespace.Program.MyField.ImportantProperty в окно Watch во время отладки.

  4. Пошагово выполняйте код, пока значение в окне просмотра не изменится.

13
ответ дан 30 November 2019 в 05:08
поделиться

Похоже, вы запрашиваете функцию, которая приводила бы к сбою Visual Studio при изменении свойства/поля объекта.

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

value != backingField

.Для полей действительно нет хорошего решения. Отладчик C++ имеет функцию Data BreakPoints, которая имеет именно такое поведение. Но они недоступны для управляемых языков, прежде всего потому, что отладчик CLR их не поддерживает. Лучшее, что вы можете сделать, это временно изменить свое поле на свойство и использовать описанный выше метод.

3
ответ дан 30 November 2019 в 05:08
поделиться

Щелкните правой кнопкой мыши красную точку, обозначающую точку останова — выберите Условие и введите выражение, если вы хотите, чтобы точка останова прервала выполнение, или отметьте Изменено прерываться всякий раз, когда значение изменяется.

2
ответ дан 30 November 2019 в 05:08
поделиться

Я не думаю, что в VS IDE есть способ установить такую ​​общую точку останова. Если вам это действительно нужно и вы хотите внести некоторые изменения в код, вы можете взглянуть на частичные методы. Используя частичные методы, вы определяете частичный метод и вызываете его из своих сеттеров. Если вы хотите отладить, чтобы узнать, кто вызывает установщик, вы можете предоставить фиктивную реализацию частичного метода. Когда вы закончите отладку, вы можете избавиться от реализации, и компилятор не будет генерировать ничего, связанного с этим методом, как если бы он не существовал. Это загрязняет ваш код, если вы не можете придумать другое потенциальное использование частичного вызова метода из ваших сеттеров. Тем не менее, я просто хотел бросить это туда, чтобы вы знали.

1
ответ дан 30 November 2019 в 05:08
поделиться

Вы можете использовать метод System.Diagnoistic.Debugger.Break() по назначению следующим образом

if(x!= y)
    Debugger.Break()
-5
ответ дан 30 November 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: