标签: entity-framework-migrations

EF 迁移忽略字符串属性上的 [Required] 属性并创建可为 null 的字段

我一定错过了一些微不足道的事情。我想这是我第一次遇到这种情况。

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)

请注意,FirstNameLastName是必需的,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)

entity-framework asp.net-mvc-5 entity-framework-migrations

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

在 EF Core 2 中的自引用表中实现级联删除

如何在 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

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

排除迁移的属性

我的模型上有一些属性,我不想在迁移后在表中生成字段。

是否可以排除Entity Framework Core 迁移的属性

我的模型是否有一个属性或一些 Fluent API 方法DbContext

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

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

在 Entity Framework Core 6.0 中,字符串默认不可为 null

我正在 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

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

如何防止在 Entity Framework Core 6 中创建迁移并将其应用于指定的 dbContext?

我使用两个数据库上下文进行读取写入,指向相同的数据库模式。

ReadDbContextWriteDbContext有自己的读取写入模型。

由于这两种上下文配置中的关系、表名以及最后的数据库都是相同的,因此只有其中之一可以构建数据库。

有没有办法禁用为指定数据库上下文应用创建的迁移的能力?更进一步,是否有可能禁止迁移创建?

我尝试添加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

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

具有代码优先迁移的一个数据库上的多个 DbContext

我迷迷糊糊uppon同样的问题在描述这个问题。此外,我不想从数据库中丢失 __migrationHistory 表。

我使用包含所有 DbSet<> 的“超级”上下文并使用普通上下文的建议解决方案进行了尝试,但出现错误。(“模型支持 DbContext 已更改”)如果您只是从 SQL 服务器中删除 __migrationHistory 表,这很容易避免,但正如我所说,我想保留历史记录。

我找到了一个简单易行的解决方案,请参阅下面的答案。

c# entity-framework ef-code-first entity-framework-migrations

3
推荐指数
1
解决办法
5188
查看次数

无法从 PK 中删除身份属性

我需要将其中一个表上主键的数据类型从 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)

entity-framework-5 entity-framework-migrations

3
推荐指数
1
解决办法
3507
查看次数

EFCore 无法识别数据库提供程序

我有一个 .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

3
推荐指数
1
解决办法
2333
查看次数

在类“Program”上调用方法“BuildWebHost”时出错

当我运行时 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

3
推荐指数
1
解决办法
2160
查看次数

更改实体框架核心代码第一次迁移名称格式

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-core entity-framework-migrations

3
推荐指数
1
解决办法
697
查看次数