Контекст:
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), как я могу обойти его, чтобы сохранить экземпляр своей учетной записи?
Спасибо.
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();
}
Вам необходимо зарегистрировать свой контекст в контейнере DI, после чего он может быть вставлен в любой конструктор объекта, который вам нужен. И вам не нужно каждый раз создавать контекст вручную. Подробнее здесь а>
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.