EfCore 3.1 пытается добавить столбец, который уже существует - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть рабочий. NET Проект Core 2.2, который я только что обновил. NET Core 3.1

Есть что-то странное с происходящим EntityFrameworkCore, и я не знаю, с чего начать

У меня есть следующая (упрощенная) модель:

public class Asset()
{
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   [Key]
   public Guid Id { get; set; }
   public Guid MainImageId{ get; set; }
   public Image MainImage { get; set; }
   public ICollection<Image> Images { get; set; }
}

public class Image()
{
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   [Key]
   public Guid Id { get; set; }
   public Guid AssetId { get; set; }
   public Asset Asset { get; set; }
}

Таким образом, актив имеет 1 MainImage.

Это определено в моей модели следующим образом:

modelBuilder.Entity<Image>().HasOne(x => x.Asset).WithMany(x => x.Images).OnDelete(DeleteBehavior.Restrict);

Это определенно работало, пока я не обновился. Теперь каждый раз, когда происходит ВЫБОР в таблице Assets, он пытается выбрать столбец MainImageId1, который не существует. Если я попытаюсь AddMigration, я увижу, что EF Core добавит столбец с именем MainImageId1 и поместит внешний ключ в таблицу Images.

Я попытался добавить правильное имя столбца к этому свойство, но это также не сработало:

modelBuilder.Entity<Asset>().Property(x => x.MainImageId).HasColumnName("MainImageId");

Кто-нибудь знает, как я могу отладить это дальше? Возможно, что-то не так в моем классе DbContext?

1 Ответ

0 голосов
/ 03 февраля 2020

Я в конце концов нашел ответ. Мне не хватало свойства, которое, по-видимому, необходимо для того, чтобы убедиться, что Entity Framework понимает взаимосвязь.

public class Asset()
{
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   [Key]
   public Guid Id { get; set; }
   public Guid MainImageId{ get; set; }
   public Image MainImage { get; set; }
   public ICollection<Image> Images { get; set; }
}

public class Image()
{
   [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
   [Key]
   public Guid Id { get; set; }
   public Guid AssetId { get; set; }
   public Asset Asset { get; set; }

   //THIS WAS ADDED TO SOLVE THE PROBLEM:
   public ICollection<Asset> MainAssets {get;set;}
}

Я добавил коллекцию MainAssets в класс Images, а затем обновил свою модель, включив в нее следующие два Отображения:

modelBuilder.Entity<Image>()
    .HasOne(x => x.Asset)
    .WithMany(x => x.Images)
    .HasForeignKey(x => x.AssetId);

modelBuilder.Entity<Asset>()
    .HasOne(x => x.MainImage)
    .WithMany(x => x.MainAssets)
    .HasForeignKey(x => x.MainImageId);

И теперь все снова работает нормально. Кажется, что добавление коллекции MainAssets стало ключом к тому, чтобы структура Entity лучше понимала отношения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...