实体框架-无法引用实体上下文

时间:2020-02-11 09:30:30

标签: c# entity-framework asp.net-core dbcontext

上下文:

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选项),如何才能通过它,以便保存我的Account实例?

谢谢。

3 个答案:

答案 0 :(得分:0)

您可以将依赖项注入(构造函数注入)与IOC容器一起使用,

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

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

最受欢迎的IOC容器,

  • 统一容器
  • 温莎城堡
  • NInject
  • 结构图

您需要使用IOC容器指定如何创建EntityContext实例,例如单例,作用域或瞬态。像这样的东西

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

答案 1 :(得分:0)

您需要在DI容器中注册上下文,然后可以将其注入到所需的任何对象的构造函数中。您无需每次都手动构造上下文。 See more here

答案 2 :(得分:0)

您需要配置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"
  }
}

然后,依赖项注入容器将在创建对象时为实体上下文提供选项。

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作为构造函数参数传递:

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

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