簡體   English   中英

映射表的 ASP.NET Core 導航屬性

[英]ASP.NET Core Navigation Properties For Mapping Table

我有一個名為 contract 的表,它具有實體 1 和實體 2 的 id。我使用它來創建實體之間的鏈接,但是我似乎無法獲得正確的 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);

        }

    }

從您的模型設計來看, 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);
    }

加載相關數據,可以使用Sharif上面建議的Include方法,指定查詢結果中要包含的相關數據。

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

結果在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM