ASP. NET Основные свойства навигации для таблицы сопоставления - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть таблица с именами контрактов, в которой есть идентификатор сущности 1 и сущности 2. Я использую ее для создания связей между сущностями, однако, похоже, не могу правильно определить определение dbContext. Я могу получить контракты для загрузки, но только один объект. Когда я просматриваю контракт, загружается либо Entity1, либо Entity2, но никогда не оба.

Модели выглядят так:

 public class Contract
    {
        public int Entity1ID { get; set; }
        public int Entity2ID { get; set; }

        public Entity Entity1 { get; set; }

        public Entity Entity2 { get; set; }
    }

Мой класс сущностей выглядит следующим образом

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

    public ICollection<Contract> Contracts1 { get; set; };
    public ICollection<Contract> Contracts2 { get; set; };
}

Это мой dbContext

public class EntityDbContext : DbContext
    {
        public EntityDbContext(DbContextOptions<EntityDbContext> options)
        : base(options)
        {


        }

        public DbSet<Models.Entity> Entities { get; set; }
        public DbSet<Models.Contract> Contracts { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Entity>()
                .HasKey(n => n.ID);

            modelBuilder.Entity<Contract>()
               .HasKey(n => new { n.Entity1ID, n.Entity2ID });

            modelBuilder.Entity<Contract>()
                .HasOne(n => n.Entity1)
                .WithMany(n => n.Contracts1)
                .HasForeignKey(n => n.Entity1ID);

            modelBuilder.Entity<Contract>()
                .HasOne(n => n.Entity2)
                .WithMany(n => n.Contracts2)
                .HasForeignKey(n => n.Entity2ID);

        }

    }

1 Ответ

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

В модели вашей модели имеется самоотносительное отношение «многие ко многим» в модели Entity, поэтому вы должны изменить DeleteBehavior на Restrict (по умолчанию - каскад), как показано ниже:

 protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Entity>()
            .HasKey(n => n.ID);

        modelBuilder.Entity<Contract>()
           .HasKey(n => new { n.Entity1ID, n.Entity2ID });

        modelBuilder.Entity<Contract>()
            .HasOne(n => n.Entity1)
            .WithMany(n => n.Contracts1)
            .HasForeignKey(n => n.Entity1ID)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<Contract>()
            .HasOne(n => n.Entity2)
            .WithMany(n => n.Contracts2)
            .HasForeignKey(n => n.Entity2ID)
            .OnDelete(DeleteBehavior.Restrict);
    }

Для загрузки связанных данных вы можете использовать метод Include, который Шариф предложил выше, чтобы указать связанные данные, которые будут включены в результаты запроса

var result = _context.Contracts
            .Include(c => c.Entity1)
            .Include(c => c.Entity2)
            .ToList();

Результат enter image description here

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