如何播种新的接合表

本文关键字:接合 何播种 | 更新日期: 2023-09-27 18:21:54

我在实体框架中首先使用代码。我的数据库中有两个表——Clients和Products。里面有一些数据。我添加了一个新的连接表,它对这两个表都有外键。我该如何在那张桌子上播种?当我添加新的客户端或产品时,实体框架是否会添加新行,因为它似乎没有。:

public class UserPriceList
    {
        public UserPriceList()
        {
            PriceFactor = 1M;
        }
        [Key]
        public int UserPriceListId { get; set; }
        [Index("IX_UserPrice", 1)]
        public int ProductId { get; set; }
        public virtual Product Product { get; set; }
        [Index("IX_UserPrice", 2)]
        public int ClientId { get; set; }
        public virtual Client Client { get; set; }
        public decimal PriceFactor { get; set; }
    }

如何播种新的接合表

您的UserPriceList看起来很像一个连接表,但EntityFramework并不是这样查看它的,因为您将它定义为一个具有附加属性的实体。通过将ICollection添加到客户端并将IColletion添加到产品,会在后台自动创建一个连接表,作为一个具有ProductId和ClientId的表。没有定义的模型,你可以通过Client.Products.Add(someProduct)与它交互,它会在后台填充连接表。

为了让你的UserPriceList作为一个连接表工作,你可以在你的OnModelCreating 中尝试这样的东西

modelBuilder.Entity<Product>()
    .HasMany(x => x.Clients)
    .WithMany(x => x.Products)
.Map(x =>
{
    x.ToTable("UserPriceList"); // third table is named Cookbooks
    x.MapLeftKey("ProductId");
    x.MapRightKey("ClientId");
});

以显式地将UserPriceList映射为连接表。您可能会遇到不可为null的小数(或者可能不会,因为您在构造函数中设置了一个值)以及将UserPriceList定义为实体的问题。

您还可以将UserProductList作为一个实体进行交互,并显式地向其中添加项目

可能最安全的(最有可能工作的)方法是删除ICollection<产品>来自客户端和ICollection<客户端>从产品添加ICollection<用户价目表>两者都有。