Entity Framework - не может ссылаться на контекст объекта - PullRequest
0 голосов
/ 11 февраля 2020

Контекст:

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), как мне пройти через это, чтобы я мог сохранить свой экземпляр учетной записи?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2020

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

0 голосов
/ 11 февраля 2020

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

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

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

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

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

и в настройках приложения. json, вам необходимо определить строку подключения:

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

Затем контейнер внедрения зависимостей предоставит параметры для контекста сущности, когда объект является создал.

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 в самом контексте ( Когда Dependency Injection Container не используется):

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 голосов
/ 11 февраля 2020

Вы можете использовать внедрение зависимостей (конструктор) с контейнером IO C, например

public class YourClass {
    private readonly EntityContext context; 
    public YourClass(EntityContext context) {
        this.context = context;
    }

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

Самые популярные контейнеры IO C,

  • Контейнер Unity
  • Замок Виндзор
  • NInject
  • Структура карты

В контейнере IO C необходимо указать, как создать Экземпляр EntityContext, такой как singleton, scoped или transient. Как то так;

var container = new YourContainer();
container.Register<DbContext>(Lifestyle.Scoped);
...