0

现有的 ASP.NET Core 2.1 应用程序(针对 netcore2.1 运行)已迁移到 ASP.NET Core 2.2(安装了 sdk 并更改了目标)。现在,每当我运行应用程序时,它都会开始显示传统的“ApplicationDbContext 有待处理的模型更改”。

如果我按照说明尝试添加迁移,我注意到它实际上会生成一个新的迁移文件。通过运行差异,我可以看到它将这些行添加到应用程序上下文快照中:

modelBuilder.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")

它还将以下内容添加到我的实体中:

b.Property<long?>("UserServiceId1");
b.Property<long?>("UserServiceServiceId");
b.Property<long?>("UserServiceUserId");

我不确定它从哪里获得 UserServiceId1 名称(实体具有 UserServiceId 属性)。顺便说一句,这是实体类代码:

[Table("UserIdentifiers", Schema = "Gov")]
public class UserIdentifiers
{
    [Required]
    public long UserId { get; set; }
    [Required]
    public long ServiceId { get; set; }
    [Required]
    public long UserServiceId { get; set; }
    [Required]
    public long IdentifierId { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public long UserIdentifierId { get; set; }

    public virtual Identifiers Identifier { get; set; }
    public virtual UserServices UserService { get; set; }
}

映射到该实体的表具有从 UserId、ServiceId、UserServiceId、IdentifierId 和 UserIdentifierId 构建的复合键。快照的定义如下:

b.HasKey("UserId", "ServiceId", "UserServiceId", "IdentifierId", "UserIdentifierId");

哦,是的,还有用于删除 UserServiceId 列并添加“新” UserServiceId1 列的迁移文件。

我不是真正的 EF 专家,所以我不确定为什么在从 2.1 迁移到 2.2 后它停止工作。

那么,谁能指出我正确的方向?

顺便说一句,有没有办法在 ef 核心上禁用迁移?

谢谢

编辑:添加实体引用的类UserIdentifiers(仅显示类之间的关系):

// identifiers

[Table("Identifiers", Schema = "Gov")]
public class Identifiers
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public long IdentifierId { get; set; }
    [Required]
    public int IdentityResourceId { get; set; }

    [Required]
    public long ServiceId { get; set; }
    public virtual Services Service { get; set; }
}

//Services
[Table("Services", Schema = "Gov")]
public class Services
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public long ServiceId { get; set; }

    public virtual List<Identifiers> Identifiers { get; set; }
    public virtual List<UserServices> UserServices { get; set; }
    public virtual List<ClientServices> ClientServices { get; set; }

}

// userservices
[Table("UserServices", Schema = "Gov")]
public class UserServices
{
    [Required]
    public long UserId { get; set; }
    [Required]
    public long ServiceId { get; set; }
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Required]
    public long UserServiceId { get; set; }

    public virtual List<UserIdentifiers> UserIdentifiers { get; set; }
    public virtual Services Service { get; set; }
    public virtual ApplicationUser User { get; set; }
}

最后,这是OnModelCreating方法内部执行的配置:

builder.Entity<Identifiers>()
    .HasKey(x => new { x.ServiceId, x.IdentifierId });
builder.Entity<UserIdentifiers>()
    .HasKey(x => new { x.UserId, x.ServiceId, x.UserServiceId, x.IdentifierId, x.UserIdentifierId });
builder.Entity<UserServices>()
    .HasKey(x => new { x.UserId, x.ServiceId, x.UserServiceId });
builder.Entity<ClientServices>()
    .HasKey(x => new { x.ServiceId, x.ClientId, x.ClientServiceId });
4

1 回答 1

0

我的一个朋友通过在模型中添加“缺失”的外键信息来解决它:

[ForeignKey("ServiceId, IdentifierId")]
public virtual Identifiers Identifier { get; set; }
[ForeignKey("UserId, ServiceId, UserServiceId")]
public virtual UserServices UserService { get; set; }

现在一切都按预期进行。

再次感谢

于 2019-01-08T11:12:43.143 回答