如何在 EF 核心中的现有实体之间创建关系?

时间:2021-05-14 16:41:30

标签: c# asp.net-core entity-framework-core

我有一个案例场景,其中有两个表 References 和 Products 已经包含许多可以按需动态关联的条目。

public class Reference
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ReferenceId { get; set; }
    public string Name { get; set; }
    public string Status { get; set; } 
    public virtual ICollection<Product> ManyProducts { get; set; }
    public Reference() {}
}

public class Product
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ProductId { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; } 
    [ForeignKey("Reference")]
    public Guid ReferenceId { get; set; }
    public virtual Reference OneReference { get; set; }
    public Product() {}
}

当用户要求将参考链接到产品时,我只是这样做:

product.ReferenceId = reference.ReferenceId ;
await context.SaveChangesAsync() ;

Products 表中的条目已正确更新,但是当我尝试访问引用的相关数据时,它没有检索任何 ??急切加载后:

var reference = await context.References
   .Include(r => r.ManyProducts)
   .SingleAsync(r => r.ReferenceId == referenceId) ;

或显式加载:

var reference = await context.References.FindAsync(referenceId) ;
await context.Entry(reference).Collection(s => s.ManyProducts).LoadAsync() ;

reference.ManyProducts 为空。所以我必须做这样的事情:

var reference =  await context.References.FindAsync(referenceId) ;
var products = await context.Products.Where(l => l.ReferenceId == referenceId).ToListAsync() ;
result.ManyProducts = products ;

哪个工作正常,但我想了解为什么?

1 个答案:

答案 0 :(得分:0)

我正在使用数据注释

样品

 public class spread
    {       
        [Key]
        public int spreadid { get; set; }
        [Required]
        public DateTime insertdate { get; set; }
        [Required]
        public int exchangeid { get; set; }
        [ForeignKey("exchangeid"), Display(Name = "Exchange origem")]
        public virtual exchange exchange { get; set; } // One to one
        [ForeignKey("spreadid")]
        public virtual ICollection<spreadhelper> spreadhelper { get; set; } // One to many
}


public class spreadhelper
    {        
        [Key]
        public int spreadhelperid { get; set; }
        [Required]
        public int spreadid { get; set; }
        [Required]
        public int exchangeid { get; set; }
        [ForeignKey("exchangeid"), Display(Name = "Exchange")] // One to one
        public virtual exchange exchange { get; set; }
        [Required, Range(0, 200)]
        public decimal spreadvalue { get; set; }
    }

一对一 - 样品

 public class exchange
    {       
        [Key]
        public int exchangeid { get; set; }
        [Required]
        public DateTime insertdate { get; set; }
        [Required, MaxLength(50)]
        public string name { get; set; }
        [MaxLength(128)]
        public string token { get; set; }
    }

一对多样本