简体   繁体   English

哪一个是 EF 中正确的一对多关系

[英]Which one is the correct one-to-many relation in EF

i am designing a system and one of my entity has one to many relation as shown below.我正在设计一个系统,我的一个实体具有一对多的关系,如下所示。

public class Product
{
    public int Id { get; set; }
}

public class CompetitorProduct
{
    public int Id { get; set; }
    public Product Product { get; set; }
}

competitorProduct indicates that product has a equivalent which is sold by different store.竞争者产品表示该产品具有由不同商店销售的等价物。 should i define one-to-many relation as shown above or below?我应该定义如上或下所示的一对多关系吗? which one is correct?哪一个是正确的?

public class Product
{
    public int Id { get; set; }
    public virtual ICollection<CompetitorProduct> CompetitorProducts{ get; set; }

}

public class CompetitorProduct
{
    public int Id { get; set; }
}

Assuming it is a one to many relationship (what would happen if a competitor product was competing with more than one of your products for example) you can do both and add in a foreign key as well.假设它是一对多的关系(例如,如果竞争对手的产品与您的多个产品竞争会发生什么),您可以同时添加外键。

public class Product
{
    public int Id { get; set; }
    public virtual ICollection<CompetitorProduct> CompetitorProducts { get; set; }  
}

public class CompetitorProduct
{
    public int Id { get; set; }
    public int ProductId { get; set; }
    public virtual Product Product { get; set; }
}

You can then set up your relationship using fluent API as so:然后,您可以使用流利的 API 设置您的关系,如下所示:

modelBuilder.Entity<CompetitorProduct>(entity =>
{
    entity.HasOne(e => e.Product)
          .WithMany(e => e.CompetitorProducts)
          .HasForeignKey(e => e.ProductId)
          .HasConstraintName("FK_ComptetitorProduct_Product");
});

This way you can access the competitor products from the product and the product from the competitor products.这样您就可以从产品中访问竞争对手的产品,从竞争对手的产品中访问产品。

Here is a quick example of a ecommerce site I have worked on and how we did table relations.这是一个我工作过的电子商务网站的简单示例,以及我们如何处理表格关系。

I removed a bunch of the fields so you can see what you really need.我删除了一堆字段,这样您就可以看到您真正需要的内容。 Once to make relations and run Add-Migration EF will handle the FK constraints for you as long as you identified them in models like how I have below.一旦建立关系并运行 Add-Migration EF 将为您处理 FK 约束,只要您在模型中识别它们,如下所示。

public class ApplicationUser : IdentityUser
    {
        public ApplicationUser()
        {
            Active = true;
            CreateDateTimeUtc = DateTime.UtcNow;
            ModifiedDateTimeUtc = DateTime.UtcNow;
        }


        [StringLength(500)]
        public string FirstName { get; set; }
        [StringLength(500)]
        public string LastName { get; set; }

        [StringLength(1000)]
        public string Address { get; set; }
        [StringLength(100)]
        public string Unit { get; set; }
        [StringLength(250)]
        public string City { get; set; }
        [StringLength(25)]
        public string State { get; set; }
        [StringLength(20)]
        public string ZipCode { get; set; }

        //This will give access to a list of child carts a user could have
        [Index]
        public bool Active { get; set; }
        public virtual ICollection<Cart> Carts { get; set; }


        // Account Profile Image
        public byte[] ProfileImage { get; set; }
        [StringLength(500)]
        public string ProfileFilename { get; set; }
        [StringLength(100)]
        public string ProfileMimeType { get; set; }

    }

[Table("Cart", Schema = "dbo")]
    public class Cart : AbstractTable
    {
        public Cart()
        {
            IsComplete = false;
        }

        //This create relation to user table where I can get one unique user.
        [StringLength(128)]
        [ForeignKey("ApplicationUser")]
        public string UserId { get; set; }
        public virtual ApplicationUser ApplicationUser { get; set; }


        //These link us to child tables of Cart where we can get a LIST of the items below
        public virtual ICollection<CartCategory> CartCategories { get; set; }
        public virtual ICollection<CartItem> CartItems { get; set; }

        // Marked when a payment/receipt is generated based off of this cart
        public bool IsComplete { get; set; }

    }

[Table("CartItem", Schema = "dbo")]
    public class CartItem : AbstractTable
    {
        //This will return one unique cart id and let us access it as the parent record
        [ForeignKey("Cart")]
        public Guid CartId { get; set; }
        public virtual Cart Cart { get; set; }

        // Signifies if this was paid for in a receipt
        public bool IsComplete { get; set; }

        public virtual ICollection<CartItemCustomField> CustomFields { get; set; }
    }

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

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