Контекст:

public class EntityContext : DbContext
{
   public EntityContext(DbContextOptions options) : base(options)
      {

      }

   protected override void OnModelCreating(ModelBuilder modelBuilder)
      {
          var cascadeTables = modelBuilder.Model.GetEntityTypes()
           .SelectMany(foreignKeysTables => foreignKeysTables.GetForeignKeys())
           .Where(foreignKeysTables => !foreignKeysTables.IsOwnership &&
                  foreignKeysTables.DeleteBehavior == DeleteBehavior.Cascade);

         foreach (var table in cascadeTables)
         {
             table.DeleteBehavior = DeleteBehavior.Restrict;
         }

         base.OnModelCreating(modelBuilder);
     }

    DbSet<Account> Accounts { get; set; }
}

Сохранение в базу данных с использованием контекста:

using (var context = new EntityContext()) //error on EntityContext()
{
     context.Account.Add(acc); //error on Account because EntityContext can't be referenced
     context.SaveChanges();
}

Я не могу ссылаться на контекст, потому что для него нужен параметр (параметры DbContextOptions), как я могу обойти его, чтобы сохранить экземпляр своей учетной записи?

Спасибо.

0
user12192505 11 Фев 2020 в 12:30

2 ответа

Лучший ответ

Вам необходимо настроить DbContextOptions, поскольку DbContext требует, чтобы DbContextOptions работал правильно. DbContextOptions содержит такую информацию, как поставщик базы данных и строка подключения.

Это может быть настроено следующими способами:

1) При использовании контейнера для ввода зависимостей

Если вы используете контейнер внедрения зависимостей по умолчанию в ASP.Net Core, вы можете добавить приведенный ниже код в Startup.cs внутри метода ConfigureServices.

public void ConfigureServices(IServiceCollection services)
{
        // ...other service registration 
        services.AddDbContext<EntityContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
}

И в appsettings.json вам нужно определить строку подключения:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=servername;Database=dbname;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

Затем Dependency Injection Container предоставит опции для Entity Context при создании объекта.

public class EntityContext : DbContext
{
   public EntityContext(DbContextOptions options) : base(options)
      {

      }

      .....
}

Затем вы можете использовать в своем классе следующее:

public class AccountRepository
{
    private readonly EntityContext context;    

    public AccountRepository(EntityContext entityContext)
    {
            this.context = entityContext;
    }

    public void Save()
    {
         context.Account.Add(acc); 
         context.SaveChanges();
    }
 }

2) Параметр OnConfiguring - инициализируйте DbContextOptions в самом контексте (когда контейнер внедрения зависимости не используется):

public class EntityContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        options.UseSqlServer(connectionString);
    }

    .....
}

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

using (var context = new EntityContext()) 
{
     context.Account.Add(acc); 
     context.SaveChanges();
} 

3) Передайте DbContextOptions в качестве аргумента конструктора при создании экземпляра Context (когда контейнер внедрения зависимостей не используется):

var optionsBuilder = new DbContextOptionsBuilder<EntityContext>();
optionsBuilder.UseSqlServer(connectionString);

using (var context = new EntityContext(optionsBuilder.Options)) 
{
     context.Account.Add(acc); 
     context.SaveChanges();
} 
0
Bob Ash 11 Фев 2020 в 11:47

Вам необходимо зарегистрировать свой контекст в контейнере DI, после чего он может быть вставлен в любой конструктор объекта, который вам нужен. И вам не нужно каждый раз создавать контекст вручную. Подробнее здесь

0
Michael Mankiewicz 11 Фев 2020 в 09:53