簡體   English   中英

實體框架 - 無法引用實體上下文

[英]Entity Framework- Cannot reference entity context

語境:

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 實例?

謝謝你。

您可以將依賴注入(構造函數注入)與 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 容器,

  • 統一容器
  • 溫莎城堡
  • 注入
  • 結構圖

您需要使用 IOC 容器指定如何創建 EntityContext 的實例,如單例、作用域或瞬態。 像這樣的東西;

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

您需要在 DI 容器中注冊您的上下文,然后可以將其注入您需要的任何對象的構造函數。 而且您不需要每次都手動構建上下文。 在這里查看更多

您需要配置 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) 在實例化 Context 時將 DbContextOptions 作為構造函數參數傳遞(當不使用依賴注入容器時):

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM