EF Core 2.2:迁移开始报告上下文有未决的模型更改
EF Core 2.2: migrating starts reporting that there are pending model changes for a context
现有 ASP.NET Core 2.1 应用程序(运行 针对 netcore2.1)已迁移到 ASP.NET Core 2.2(安装了 sdk 并更改了目标)。现在,每当我 运行 应用程序时,它就会开始显示传统的 "There are pending model changes for ApplicationDbContext".
如果我按照说明尝试添加迁移,我注意到它实际上生成了一个新的迁移文件。通过 运行 差异,我可以看到它正在将这些行添加到应用程序上下文快照中:
modelBuilder.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
它还会将以下内容添加到我的实体中:
b.Property<long?>("UserServiceId1");
b.Property<long?>("UserServiceServiceId");
b.Property<long?>("UserServiceUserId");
我不确定它从哪里获得 UserServiceId1 名称(该实体有一个 UserServiceId 属性)。顺便说一句,这是实体 class 代码:
[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; }
}
映射到此实体的 table 具有一个由 UserId、ServiceId、UserServiceId、IdentifierId 和 UserIdentifierId 构建的复合键。快照的定义如下:
b.HasKey("UserId", "ServiceId", "UserServiceId", "IdentifierId", "UserIdentifierId");
哦,是的,还有用于删除 UserServiceId 列并添加 "new" UserServiceId1 列的迁移文件。
我不是真正的 EF 专家,所以我不确定为什么在从 2.1 迁移到 2.2 后它停止工作。
那么,谁能指出我正确的方向?
顺便说一句,有没有办法在 ef core 上禁用迁移?
谢谢
编辑:添加 UserIdentifiers
实体引用的 classes(仅显示 classes 之间的关系):
// 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 });
我的一个朋友通过向模型添加 "missing" 外键信息解决了这个问题:
[ForeignKey("ServiceId, IdentifierId")]
public virtual Identifiers Identifier { get; set; }
[ForeignKey("UserId, ServiceId, UserServiceId")]
public virtual UserServices UserService { get; set; }
现在一切如期进行。
再次感谢
现有 ASP.NET Core 2.1 应用程序(运行 针对 netcore2.1)已迁移到 ASP.NET Core 2.2(安装了 sdk 并更改了目标)。现在,每当我 运行 应用程序时,它就会开始显示传统的 "There are pending model changes for ApplicationDbContext".
如果我按照说明尝试添加迁移,我注意到它实际上生成了一个新的迁移文件。通过 运行 差异,我可以看到它正在将这些行添加到应用程序上下文快照中:
modelBuilder.HasAnnotation("ProductVersion", "2.2.0-rtm-35687")
它还会将以下内容添加到我的实体中:
b.Property<long?>("UserServiceId1");
b.Property<long?>("UserServiceServiceId");
b.Property<long?>("UserServiceUserId");
我不确定它从哪里获得 UserServiceId1 名称(该实体有一个 UserServiceId 属性)。顺便说一句,这是实体 class 代码:
[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; }
}
映射到此实体的 table 具有一个由 UserId、ServiceId、UserServiceId、IdentifierId 和 UserIdentifierId 构建的复合键。快照的定义如下:
b.HasKey("UserId", "ServiceId", "UserServiceId", "IdentifierId", "UserIdentifierId");
哦,是的,还有用于删除 UserServiceId 列并添加 "new" UserServiceId1 列的迁移文件。
我不是真正的 EF 专家,所以我不确定为什么在从 2.1 迁移到 2.2 后它停止工作。
那么,谁能指出我正确的方向?
顺便说一句,有没有办法在 ef core 上禁用迁移?
谢谢
编辑:添加 UserIdentifiers
实体引用的 classes(仅显示 classes 之间的关系):
// 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 });
我的一个朋友通过向模型添加 "missing" 外键信息解决了这个问题:
[ForeignKey("ServiceId, IdentifierId")]
public virtual Identifiers Identifier { get; set; }
[ForeignKey("UserId, ServiceId, UserServiceId")]
public virtual UserServices UserService { get; set; }
现在一切如期进行。
再次感谢