如何播种新的联结表

时间:2014-09-14 17:46:39

标签: c# sql entity-framework ef-code-first code-first

我在Entity框架中首先使用Code。我的数据库中有两个表 - 客户端和产品。其中有一些数据。我添加了一个新的联结表,它有两个外键。我应该怎样播种那张桌子?当我添加新客户端或产品时,实体框架会添加新行,因为它似乎没有。:

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

1 个答案:

答案 0 :(得分:0)

您的UserPriceList看起来很像联结表,但EntityFramework不会以这种方式查看它,因为您将其定义为具有其他属性的实体。通过向客户端添加ICollection和向产品添加ICollection,可以在幕后自动创建联结表,作为具有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显式映射为联结表。您可能遇到非可空小数的问题(或者可能不是因为您在构造函数中设置了一个值)并且将UserPriceList定义为实体。

您也可以作为实体与UserProductList进行交互,并明确地向其添加项目。

可能最安全(最有可能工作)的方法是删除ICollection&lt; Product&gt;来自客户和ICollection&lt;客户&gt;从产品添加ICollection&lt; UserPriceList&gt;两者都有。