Почему свойство shadow генерируется, когда эта модель реализует IEnumerable? - PullRequest
1 голос
/ 25 февраля 2020

У меня есть следующие классы моделей:

public class Farmer
{
    public int ID { get; set; }

    public Box Box { get; set; }
}

public class Apple
{
    public int BoxID { get; set; }

    public Box Box { get; set; }

    public int Number { get { return (int)V2.X; } set { V2 = new Vector2(value, 0); } }

    public Vector2 V2 {get;set;}

    public Farmer Owner { get; set; }
}

public class Box : IEnumerable<Apple>
{
    public int ID { get; set; }
    public ICollection<Apple> Apples { get; set; }

    public IEnumerator<Apple> GetEnumerator()
    {
        return Apples.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return Apples.GetEnumerator();
    }
}

Когда Box реализует IEnumerable <'Apple'>, свойство тени FarmerID добавляется в таблицу Apple:

migrationBuilder.AddColumn<int>(
            name: "FarmerID",
            table: "Apples",
            nullable: true);

        migrationBuilder.CreateIndex(
            name: "IX_Apples_FarmerID",
            table: "Apples",
            column: "FarmerID");

        migrationBuilder.AddForeignKey(
            name: "FK_Apples_Farmers_FarmerID",
            table: "Apples",
            column: "FarmerID",
            principalTable: "Farmers",
            principalColumn: "ID",
            onDelete: ReferentialAction.Restrict);

Когда Я комментирую реализацию IEnumerable, ожидаемая миграция создается без теневого свойства FarmerID. Почему генерируется это свойство shadow и как его можно удалить? (Я попытался проигнорировать это, но затем я получил FarmerID1).

Я должен упомянуть, что это мой контекстный класс:

public class Context : DbContext
{

   public DbSet<Farmer> Farmers { get; set; }

    public DbSet<Apple> Apples { get; set; }

    public DbSet<Box> Boxes { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"...");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Apple>()
         .HasOne(a => a.Box)
         .WithMany(a => a.Apples)
         .IsRequired();

        modelBuilder.Entity<Apple>()
            .Ignore(a => a.V2)
            .Ignore(a => a.Owner)
            .HasKey(a => new { a.BoxID, a.Number });
    }
}

1 Ответ

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

Проблема в том, что свойства идентификаторов моделей Фермера и Бокса не сопоставляются, что требует от EF Core создания свойства тени для яблок для сопоставления фермера с Боксом.

Для решения проблемы, можно сделать следующее:

  • Переименовать ID в Id. Ядро EF использует очень специфические c соглашения об именах для сопоставления свойств, даже в конструкторах, поэтому, если свойства не названы в соответствии с соглашением, ожидаемым EF Core, произойдет сбой.
  • Добавить [Key] к ID .
  • Используйте Fluent API .HasKey, чтобы указать ключ.
...