winforms应用程序中关于EF的信息并不多。在他的 msdn 页面上,我们发现:
使用 Windows Presentation Foundation (WPF) 或 Windows 窗体时,请为每个窗体使用一个上下文实例。这使您可以使用上下文提供的更改跟踪功能。
所以我认为我不应该使用:
using (var context = new MyAppContext())
{
// Perform operations
}
Run Code Online (Sandbox Code Playgroud)
但我应该在每个MyAppContext表单的加载时创建一个新的,并在表单关闭时(也可以选择之前)释放它。SaveChange()
这是对的吗 ?
如果是,我如何在运行时更改整个应用程序的数据库?
我想知道为什么DbContext使用实体框架时的核心类是一个具体类。
事实上,我们从不直接使用这个类,只是通过继承它。
将其声明为抽象不是更清晰吗?它成为具体类的原因是什么?
我正在 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) 我想自定义 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
我正在使用 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 …
采用以下 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 …
我正在为用户创建配置文件,向 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) _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) 我前面问了一个问题,为什么当我联合两个实体集合时,默认的相等比较器似乎不起作用.
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)
但是,当我从上一个问题再次尝试我的工会时,我仍然收到重复的实体!我做错了什么?如何在一个请求中确实使用相同的上下文?
我有一个与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?
dbcontext ×10
c# ×8
.net ×2
asp.net-core ×2
asp.net-mvc ×1
database ×1
entity-framework-migrations ×1
http-put ×1
mysql ×1
winforms ×1