Два dbcontext для одной базы данных - PullRequest
2 голосов
/ 15 апреля 2019

У меня есть решение со следующими двумя проектами:

  • Библиотека классов Razor
  • Веб-приложение ASP.NET Core

В библиотеке классовУ меня есть dbcontext, как это:

public partial class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public DbSet<Customer> Customers { get; set; }
}

В веб-приложении я регистрирую dbcontext как сервис, используя следующие строки в моем файле Startup.cs

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("ApplicationDbContextConnection")));

На этом этапе яможно использовать dbcontext в обоих проектах.Теперь, не изменяя библиотеку классов, я хочу определить новые таблицы для той же базы данных, поэтому я создал новый проект dbcontext в проекте веб-приложения, который наследует тот, который у меня есть в библиотеке классов.

public class ExtendedApplicationDbContext : ApplicationDbContext
{
    public ExtendedApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }
    public DbSet<Product> Products { get; set; }
}

Я обновляю свой файл Startup.cs, чтобы я также зарегистрировал новый dbcontext, чтобы я мог использовать таблицу «Продукты» в веб-приложении.

        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("ApplicationDbContextConnection")));
        services.AddDbContext<ExtendedApplicationDbContext>(options =>
            options.UseSqlServer(
                Configuration.GetConnectionString("ApplicationDbContextConnection")));

Теперь я могу использовать ApplicationDbContext в обоих проектахно когда я пытаюсь использовать ExtendedApplicationDbContext в веб-приложении, происходит что-то странное.

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

Я пытаюсь объяснить это, но не могу найти способ решить проблему.Может ли кто-нибудь помочь мне понять, что не так с моим кодом?

1 Ответ

2 голосов
/ 15 апреля 2019

EF-контексты хранят кеш объекта и внутреннее отслеживание изменений. Наличие двух отдельных контекстов, ссылающихся на одну и ту же базу данных, неизбежно приведет к проблемам с синхронизацией, которые затем приведут к тому, что один контекст будет затормаживать то, что делает другой контекст, и наоборот. Короче говоря, у вас должен быть один и только один активный контекст на базу данных.

Я указываю active , потому что можно использовать «ограниченные» контексты, где у вас есть несколько контекстов, которые фактически соединяются с одной и той же базой данных, но такие контексты должны иметь дело только с подмножеством объекты в базе данных, без наложения. Например, у вас может быть один контекст для работы с Клиентами и один для работы с Продуктами, но тогда не должно быть никакого перекрестного перехода между ними, то есть контекст «Продукты» не должен быть каким-либо образом (даже посредством простого отношения) ссылаться на клиента, и наоборот.

Длинный и короткий, это не правильный путь. Во-первых, ни RCL, ни веб-приложение не должны иметь контекст. Он должен находиться в другой библиотеке классов, которая затем может использоваться двумя другими проектами. Кроме того, уровень веб-приложения не должен вносить какие-либо изменения схемы в уровень данных, поскольку этот уровень данных используется другими вещами. Это хороший способ выстрелить себе в ногу. Сохраните материал уровня данных вместе с уровнем данных.

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