我一定错过了一些微不足道的事情。我想这是我第一次遇到这种情况。
我ApplicationUser : IdentityUser用一些基本数据扩展了我的课程。其中一些是必需的,一些是可选的。简化摘录:
public class ApplicationUser : IdentityUser
{
[Required]
public string FirstName { get; set; }
[Required]
public string LastName { get; set; }
[Column(TypeName = "Date")]
public DateTime? BirthDate { get; set; }
public string NationalNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请注意,FirstName和LastName是必需的,NationalNumber不是。BirthDate, 存在nullable, 也不是。这会产生以下自动生成的代码:
CreateTable(
"dbo.AspNetUsers",
c => new
{
Id = c.String(nullable: false, maxLength: 128),
UserName = c.String(),
PasswordHash = c.String(),
SecurityStamp = c.String(), …Run Code Online (Sandbox Code Playgroud) 如何在 EF Core 2 中的自引用表中实现级联删除(代码优先)?
(例如,有一个评论表,一个人可以回复一条评论,这个回复可以由另一个人回复。)
public class Comment
{
public virtual int Id { get; set; }
public virtual int? ParentId { get; set; }
public Comment Parent { get; set; }
public virtual IList<Comment> Replies { get; set; }
public virtual string Description { get; set; }
public virtual Article Article { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
entity-framework cascade entity-framework-core ef-core-2.0 entity-framework-migrations
我的模型上有一些属性,我不想在迁移后在表中生成字段。
是否可以排除Entity Framework Core 迁移的属性?
我的模型是否有一个属性或一些 Fluent API 方法DbContext?
.net c# entity-framework-core .net-core entity-framework-migrations
我正在 Entity Framework Core 6.0 中创建一个数据库表。我在我的项目中使用代码优先方法。
TestModelname中有一个字符串类型属性Address。
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace TestProjectForCore6.Models
{
public class TestModel
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public string Address { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
当我为此模型添加迁移时,它会nullable false在迁移构建器中创建一个列:
在 Entity Framework Core 5.0 中,我们不需要添加显式定义字符串属性为可为空。
c# ef-code-first entity-framework-core entity-framework-migrations ef-core-6.0
我使用两个数据库上下文进行读取和写入,指向相同的数据库模式。
ReadDbContext和WriteDbContext有自己的读取和写入模型。
由于这两种上下文配置中的关系、表名以及最后的数据库都是相同的,因此只有其中之一可以构建数据库。
有没有办法禁用为指定数据库上下文应用创建的迁移的能力?更进一步,是否有可能禁止迁移创建?
我尝试添加Database.SetInitializer<TContext>(null)到 DbContext 构造函数,但这似乎在 EF Core 6 中不起作用。
为了更好地理解,您可以查看下面的代码。
读取数据库上下文
internal sealed class ReadDbContext : DbContext
{
public DbSet<UserReadModel> Users => Set<UserReadModel>();
public DbSet<RoleReadModel> Roles => Set<RoleReadModel>();
public DbSet<PermissionReadModel> Permissions => Set<PermissionReadModel>();
public ReadDbContext(DbContextOptions<ReadDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasDefaultSchema("user-manager");
var configuration = new ReadConfiguration();
modelBuilder.ApplyConfiguration<UserReadModel>(configuration);
modelBuilder.ApplyConfiguration<RoleReadModel>(configuration);
modelBuilder.ApplyConfiguration<PermissionReadModel>(configuration);
}
}
Run Code Online (Sandbox Code Playgroud)
写数据库上下文
internal sealed class WriteDbContext : DbContext
{ …Run Code Online (Sandbox Code Playgroud) c# dbcontext entity-framework-core entity-framework-migrations
我迷迷糊糊uppon同样的问题在描述这个问题。此外,我不想从数据库中丢失 __migrationHistory 表。
我使用包含所有 DbSet<> 的“超级”上下文并使用普通上下文的建议解决方案进行了尝试,但出现错误。(“模型支持 DbContext 已更改”)如果您只是从 SQL 服务器中删除 __migrationHistory 表,这很容易避免,但正如我所说,我想保留历史记录。
我找到了一个简单易行的解决方案,请参阅下面的答案。
c# entity-framework ef-code-first entity-framework-migrations
我需要将其中一个表上主键的数据类型从 int 更改为字符串(我没有说我想要...)。迁移生成以下代码:
AlterColumn("dbo.Venues", "ID", c => c.String(nullable: false, maxLength: 128));
Run Code Online (Sandbox Code Playgroud)
这会导致 SQL Server 抱怨数据类型必须是 int、bigint 等,因为该列是标识列。我添加了以下内容,但似乎没有效果:
AlterColumn("dbo.Venues", "ID", c => c.Int(identity:false));
Run Code Online (Sandbox Code Playgroud)
问题:如何进行迁移以将数据类型从 int 更改为 string?
以下可能与我的问题有关,但不一定:迁移生成的唯一代码是上面显示的第一个 AlterColumn。当以本机生成方式运行时,迁移导致 SQL Server 抱怨它无法更改列,因为存在依赖关系。事实上,唯一的依赖是它是一个 PK(没有表将它引用为 FK)。我将迁移修改为如下所示,现在我收到了如上所示的数据类型错误。
DropPrimaryKey("dbo.Venues");
AlterColumn("dbo.Venues", "ID", c => c.Int(identity:false));
AlterColumn("dbo.Venues", "ID", c => c.String(nullable: false, maxLength: 128));
AddPrimaryKey("dbo.Venues", "ID");
Run Code Online (Sandbox Code Playgroud) 我有一个 .Net Core WebApplication 项目,其中 Context 类位于类库中。如果我在 OnConfiguring(DbContextOptionsBuilder optionsBuilder) 方法中硬编码连接字符串,我可以生成迁移。由于最好让依赖注入管理上下文,因此我想将其添加到启动类中。但是,当我这样做时,出现以下错误:
尚未为此 DbContext 配置数据库提供程序。可以通过覆盖 DbContext.OnConfiguring 方法或在应用程序服务提供者上使用 AddDbContext 来配置提供者。如果使用 AddDbContext,则还要确保您的 DbContext 类型在其构造函数中接受 DbContextOptions 对象并将其传递给 DbContext 的基本构造函数。
DbContext 类:
public class CustomerManagerContext : IdentityDbContext<User, Role, long, UserClaim, UserRole, UserLogin, RoleClaim, UserToken>
{
public CustomerManagerContext() { }
public CustomerManagerContext(DbContextOptions<CustomerManagerContext> options) : base(options)
{
}
//protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
//{
// base.OnConfiguring(optionsBuilder);
// optionsBuilder.UseSqlServer("SecretConnectionString");
//}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<User>().ToTable("Users");
builder.Entity<Role>().ToTable("Roles");
builder.Entity<UserClaim>().ToTable("UserClaims");
builder.Entity<UserRole>().ToTable("UserRoles");
builder.Entity<UserLogin>().ToTable("UserLogins");
builder.Entity<RoleClaim>().ToTable("RoleClaims");
builder.Entity<UserToken>().ToTable("UserTokens");
}
}
Run Code Online (Sandbox Code Playgroud)
启动类 - ConfigureServices …
c# entity-framework-core asp.net-core entity-framework-migrations
当我运行时 dotnet ef migrations add Initial_Identity,出现此错误:
在类“Program”上调用方法“BuildWebHost”时出错。在没有应用程序服务提供商的情况下继续。错误:GenericArguments 1 , 'Microsoft.AspNetCore.Identity.IdentityRole', on 'Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9[TUser,TRole,TContext,TKey,TUserClaim,TUserRole,TUserLogin,TUserToken,TRoleClaim]'s 违反了'TRole' 类型的约束。脚手架操作可能会导致数据丢失。请检查迁移的准确性。
我该如何解决?
这是我的代码:
创业班:
public void ConfigureServices(IServiceCollection services)
{
// some codes
services.AddIdentity<User, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>().AddDefaultTokenProviders();
}
Run Code Online (Sandbox Code Playgroud)
程序类:
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseDefaultServiceProvider(options => options.ValidateScopes = false)
.Build();
}
Run Code Online (Sandbox Code Playgroud)
TemporaryDbContextFactory 类:
public class TemporaryDbContextFactory :
IDesignTimeDbContextFactory<ApplicationDbContext>
{
////////
public ApplicationDbContext CreateDbContext(string[] args)
{
var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
IConfigurationRoot …Run Code Online (Sandbox Code Playgroud) asp.net entity-framework-core asp.net-core-2.0 ef-core-2.0 entity-framework-migrations
ef core 使用系统日历格式生成迁移名称。
Windows 上公历的标准迁移名称示例:
20190206144020_MIGRATION-NAME
Run Code Online (Sandbox Code Playgroud)
但是,如果 Windows 的日期格式不是公历,例如波斯历,则 ef 核心迁移名称会生成如下内容:
13971114210223_MIGRATION-NAME
Run Code Online (Sandbox Code Playgroud)
在团队项目中,我们不能同时使用这两种格式,因为它会改变迁移的顺序。
有没有办法在不更改 Windows 日历格式或手动重命名迁移的情况下解决该问题?
版本:EF 核心 2.2
entity-framework-migrations ×10
c# ×5
ef-core-2.0 ×2
.net ×1
.net-core ×1
asp.net ×1
asp.net-core ×1
cascade ×1
dbcontext ×1
ef-core-6.0 ×1