简体   繁体   English

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

[英]How to create a relation between existing entities in EF core?

I have a case scenario with two tables References and Products alreading containing many entries which can be dynamically related on demand.我有一个案例场景,其中包含两个表 References 和 Products alreading 包含许多可以按需动态关联的条目。

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() {}
}

When a user ask to link a reference to a product I simply do:当用户要求将参考链接到产品时,我只需执行以下操作:

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

The entry in Products table is updated correctly, but when I try to access a reference's related data, it does not retrieve any?? Products 表中的条目已正确更新,但是当我尝试访问引用的相关数据时,它没有检索到任何数据?? After eager loading:急切加载后:

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

or explicit loading:或显式加载:

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

reference.ManyProducts is empty. reference.ManyProducts 为空。 So I have to do something like this:所以我必须做这样的事情:

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

which works fine, but I would like to understand why?哪个工作正常,但我想了解为什么?

I´m using DataAnnotation我正在使用 DataAnnotation

Sample样本

 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; }
    }

one to one - sample一对一样本

 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; }
    }

One to many sample一对多样本

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM