标签: dbcontext

如何在winform应用程序中正确使用DBContext/EF?

winforms应用程序中关于EF的信息并不多。在他的 msdn 页面上,我们发现:

使用 Windows Presentation Foundation (WPF) 或 Windows 窗体时,请为每个窗体使用一个上下文实例。这使您可以使用上下文提供的更改跟踪功能。

所以我认为我不应该使用:

using (var context = new MyAppContext()) 
{     
    // Perform operations 
}
Run Code Online (Sandbox Code Playgroud)

但我应该在每个MyAppContext表单的加载时创建一个新的,并在表单关闭时(也可以选择之前)释放它。SaveChange()

这是对的吗 ?

如果是,我如何在运行时更改整个应用程序的数据库?

c# entity-framework winforms dbcontext

5
推荐指数
1
解决办法
5507
查看次数

实体框架:为什么 DbContext 是一个具体类而不是抽象类?

我想知道为什么DbContext使用实体框架时的核心类是一个具体类。

事实上,我们从不直接使用这个类,只是通过继承它。

将其声明为抽象不是更清晰吗?它成为具体类的原因是什么?

c# entity-framework dbcontext

5
推荐指数
1
解决办法
311
查看次数

C# / OSX 与内存数据库

我正在 Mac 上开发基于 C# 的 API,当我尝试按照本教程在启动/配置功能中访问 DbContext 时,.net 崩溃: https: //stormpath.com/blog/tutorial-entity-framework-core-in -内存数据库-asp-net-core

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors();
        services.AddDbContext<ApiContext>(opt => opt.UseInMemoryDatabase());
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // configure strongly typed settings objects
        var appSettingsSection = Configuration.GetSection("AppSettings");
        services.Configure<AppSettings>(appSettingsSection);

        // configure jwt authentication
        var appSettings = appSettingsSection.Get<AppSettings>();
        var key = Encoding.ASCII.GetBytes(appSettings.Secret);
        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x =>
        {
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience …
Run Code Online (Sandbox Code Playgroud)

c# dbcontext entity-framework-core

5
推荐指数
1
解决办法
372
查看次数

扩展 Identity Server 4 的配置和操作数据上下文

我想自定义 Identity Server 4 的配置和操作数据上下文。

我让您查看配置存储的代码,因为代码非常相似。

这是我的定制商店:

internal class MyConfigurationDbContext : ConfigurationDbContext
{
    public MyConfigurationDbContext(DbContextOptions<ConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
        : base(options, storeOptions)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.HasDefaultSchema("configuration");
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我有第一个疑问。我认为构造函数的签名应该是

public MyConfigurationDbContext(DbContextOptions<MyConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
Run Code Online (Sandbox Code Playgroud)

但在这种情况下它无法DbContextOptions<MyConfigurationDbContext>转换DbContextOptions<ConfigurationDbContext>

好吧,在我的启动中我有这样的代码:

builder.AddConfigurationStore<MyConfigurationDbContext>(options =>
{
    options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
        sql => sql.MigrationsAssembly(MIGRATION_ASSEMBLY));
});
Run Code Online (Sandbox Code Playgroud)

然后,我尝试生成第一次迁移:

Add-Migration InitialIdentityServerPersistedGrantDbMigration -Context MyConfigurationDbContext -OutputDir Data/Migrations/IdentityServer/PersistedGrantDb
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,我收到此错误:

Unable to resolve service for type 'Microsoft.EntityFrameworkCore.DbContextOptions`1[IdentityServer4.EntityFramework.DbContexts.ConfigurationDbContext]' while attempting to activate 'My.IdentityServer.DataLayer.Repository.Contexts.MyConfigurationDbContext'.
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

谢谢

dbcontext entity-framework-core identityserver4 entity-framework-migrations

5
推荐指数
1
解决办法
898
查看次数

EF Core MySQL - 同一上下文中的多个架构

我正在使用 EFCore 连接到 MySQL 5.7 服务器,并尝试同时将 DbContext 连接到多个架构,但它始终默认为我在连接字符串中指定的数据库

"ConnectionStrings": {
    "Database": "server=localhost; port=3306; user id=user; password=pass; database=schema1;"
  }
Run Code Online (Sandbox Code Playgroud)

在我的 Context 类中,我尝试使用该ToTable("table", "schema")属性将实体设置为具有不同的架构

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>(entity =>
    {
        entity.ToTable("users", "schema1");
    });
    modelBuilder.Entity<Order>(entity =>
    {
        entity.ToTable("orders", "schema2");  
    }); 
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我尝试从数据库检索数据时,出现以下错误:

MySql.Data.MySqlClient.MySqlException: 'Table 'schema1.orders' doesn't exist'
Run Code Online (Sandbox Code Playgroud)

如果我尝试一些明显错误的事情,比如

entity.ToTable("schema2.orders", "schema2");
Run Code Online (Sandbox Code Playgroud)

然后我毫不奇怪地得到了错误:

MySql.Data.MySqlClient.MySqlException: 'Table 'schema1.schema2.orders' doesn't exist'
Run Code Online (Sandbox Code Playgroud)

所以看起来好像它总是只使用database连接字符串中的。

如果我修改连接字符串以删除database,我相信这是朝着正确方向迈出的一步。

"ConnectionStrings": {
    "Database": "server=localhost; port=3306; user id=user; password=pass;"
  }
Run Code Online (Sandbox Code Playgroud)

然后我收到以下错误:

MySql.Data.MySqlClient.MySqlException: 'No database selected'
Run Code Online (Sandbox Code Playgroud)

我试图通过 MySQL …

c# mysql database dbcontext entity-framework-core

5
推荐指数
0
解决办法
1345
查看次数

如何在 Entity Framework Core 5/6 中映射 Nullable&lt;Ulid&gt; (或任何其他可为 null 的自定义结构)?

采用以下 Entity Framework Core 实体类:

public interface IEntity
{
    public Ulid Id { get; set; }
}

public class User : IEntity
{
    [Key]
    public Ulid Id { get; set; }
    public string Email { get; set; } = default!;
    public string FirstName { get; set; } = default!;
    public string LastName { get; set; } = default!;
    public Ulid? CompanyId { get; set; }

    // Navigation properties
    public Company? Company { get; set; } = default!;
}
Run Code Online (Sandbox Code Playgroud)

请注意,主键是一个不可为 null …

.net c# entity-framework dbcontext entity-framework-core

5
推荐指数
1
解决办法
1477
查看次数

.NET Core:“无法具体化‘IdentityUser’类型的实体实例。没有与鉴别器值匹配的鉴别器”

我正在为用户创建配置文件,向 ApplicationUser 添加列,然后在 ApplicationDbContext 中执行 DbSet 命令。仅仅编写 DbSet 命令,就会抛出错误:

InvalidOperationException:无法具体化“IdentityUser”类型的实体实例。没有鉴别器与鉴别器值“”匹配。

我做错了什么以及哪里做错了?我该如何修复它?只需将 DbSet 放到 ApplicationDbContex 中,一切就可以正常运行。

在此输入图像描述

应用程序用户的代码:

public class ApplicationUser : IdentityUser
{
    [Display(Name = "Full Name")] public string FullName { get; set; }
    public DateTime CreateAt { get; set; }
    public DateTime? UpdateAt { get; set; }
    public string ImagePath { get; set; }

    public ApplicationUser()
    {
        CreateAt = DateTime.Now;
        UpdateAt = DateTime.Now;
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序DbConText:

public class ApplicationDbContext : IdentityDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    public …
Run Code Online (Sandbox Code Playgroud)

.net c# dbcontext asp.net-core asp.net-core-5.0

5
推荐指数
1
解决办法
9912
查看次数

DbContext 更新与 EntityState 修改

_context.Entry(entity).State = EntityState.ModifiedASP.NET EF Core和之间有什么区别_context.Entity.Update(entity)?例如:

[HttpPut]
public async Task<ActionResult<Student>> PutStudent(Student student)
{
     **_context.Entry(student).State = EntityState.Modified;**
     await _context.SaveChangesAsync();
     return student;
}
Run Code Online (Sandbox Code Playgroud)
    
[HttpPut]
public async Task<ActionResult<Student>> PutStudent(Student student)
{
     **_context.Student.Update(student);**
     await _context.SaveChangesAsync();
     return student;
}
Run Code Online (Sandbox Code Playgroud)

c# http-put dbcontext entity-framework-core asp.net-core

5
推荐指数
1
解决办法
4536
查看次数

EF DbContext和Ninject

我前面问了一个问题,为什么当我联合两个实体集合时,默认的相等比较器似乎不起作用.

EF Code First - Linq to Entities Union EqualityComparer

答案是由于我使用了DbContext的两个差异实例,因此引用了不同的内容.

所以现在我想在整个请求中分享我的DbContent.我看到一些"复杂"的例子,但我想我会尝试一个更简单的解决方案.

所以我创建了一个IDbContext接口,它简单地概述了我的实体

public interface IDbContext {
   int SaveChanges();
   DbSet<News> News { get; set; }
   DbSet<Category> Categories { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的DbContext然后实现如下:

public class SiteContext : DbContext, IDbContext {
   public DbSet<News> News { get; set; }
   public DbSet<Category> Categories { get; set; }

   protected override void OnModelCreating(DbModelBuilder modelBuilder) {
      ...
   }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的两个存储库(NewsRepository和CategoryRespository)中,我将IDbContext作为构造函数参数

IDbContext _db;

public NewsRepository(IDbContext db) {
    _db = db;
}
Run Code Online (Sandbox Code Playgroud)

所以现在我假设如果我将IDbContext绑定到请求范围中的SiteContext,我的存储库将共享相同的上下文?

 kernel.Bind<IDbContext>().To<SiteContext>().InRequestScope();
Run Code Online (Sandbox Code Playgroud)

但是,当我从上一个问题再次尝试我的工会时,我仍然收到重复的实体!我做错了什么?如何在一个请求中确实使用相同的上下文?

c# ef-code-first dbcontext

4
推荐指数
1
解决办法
4464
查看次数

MVC3 DbContext保存后获取新模型的ID?

我有一个与Product_Tag型号有1:n关系的型号产品.我也有一个模型Tag与Product_Tag有1:n的关系.

class Product{
  int ID {get;set;}
  public virtual ICollection<Product_Tag> productTag {get;set;}
}

class Tag {
  int ID {get;set;}
  public virtual ICollection<Product_Tag> productTag {get;set;}

}

class Product_Tag {
  int ID {get;set;}
  int ProductID{get;set;}
  int TagID {get;set;}
  public virtual Product product {get;set;}
  public virtual Tag tag {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

保存新产品时,我希望能够将任何关联保存到Product_Tags中的标签.Product_Tag需要PRoductID和TagID.我在保存时可以使用TagID,但ProductID将来自新创建的产品.保存新产品后如何立即获取新创建的产品ID?

或者,有没有办法只使用只有TagID的productTag保存Product模型并获取DbContext来为我填写ProductID?

asp.net-mvc dbcontext

4
推荐指数
1
解决办法
3854
查看次数