EF Core 2.2: миграция начинает сообщать о наличии ожидаемых изменений модели для контекста - PullRequest
0 голосов
/ 07 января 2019

Существующее приложение 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 });

1 Ответ

0 голосов
/ 08 января 2019

Мой друг решил эту проблему, добавив в модель «недостающую» информацию об иностранных ключах:

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

А теперь все работает как положено.

еще раз спасибо

...