Существующее приложение ASP.NET Core 2.1 (работающее с netcore2.1) было перенесено в ASP.NET Core 2.2 (установил sdk и изменил цель). Теперь, когда я запускаю приложение, оно начинает показывать традиционное «Есть ожидающие изменения модели для ApplicationDbContext».
Если я следую инструкциям и пытаюсь добавить миграцию, я заметил, что она действительно генерирует новый файл миграции. Запустив diff, я вижу, что он добавляет эти строки к снимку контекста приложения:
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 });