简体   繁体   English

在播种时,实体框架在另一个表中为每个外键创建一个新记录

[英]Entity Framework creates a new record per foreign key in another table while seeding

I'm trying to seed a database using EF. 我正在尝试使用EF播种数据库。

I have a table that holds products (phones) and a Category table that differentiates between different types of products. 我有一个包含产品(电话)的表和一个区分不同类型产品的Category表。

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public DateTimeOffset? CreationDate { get; set; }
    public DateTimeOffset? UpdateDate { get; set; }

    public virtual List<IProduct> Products{ get; set; }

    public Category()
    {
        this.CreationDate = DateTimeOffset.UtcNow;
    }

}

public interface IProduct
{
    int ProductId { get; set; }
    string Brand { get; set; }
    string Model { get; set; }

    decimal? Price { get; set; }
    string Image { get; set; }

    int CategoryId { get; set; }
    Category Category { get; set; }
}

public class Phone: IProduct
{
    public int ProductId { get; set; }
    public int CategoryId { get; set; }
    public Category Category { get; set; }
    public string Brand { get; set; }
    public string Model { get; set; }
    public string network_technology { get; set; }
    public string bands_2G { get;set; }
    public string bands_3G{ get; set; }
    public string bands_4G { get; set; }
    public string network_speed { get; set; }
    public string GPRS { get; set; }
    public string EDGE { get; set; }
    public string announced { get; set; }
    public string status { get; set; }
    public string dimentions { get; set; }
    public float? weight_g { get; set; }
    public float? weight_oz { get; set; }
    public string SIM { get; set; }
    public string display_type { get; set; }
    public string display_resolution { get; set; }
    public string display_size { get; set; }
    public string OS { get; set; }
    public string CPU { get; set; }
    public string Chipset { get; set; }
    public string GPU { get; set; }
    public string memory_card { get; set; }
    public string internal_memory { get; set; }
    public string RAM { get; set; }
    public string primary_camera { get; set; }
    public string secondary_camera { get; set; }
    public string loud_speaker { get; set; }
    public string audio_jack { get; set; }
    public string WLAN { get; set; }
    public string bluetooth { get; set; }
    public string GPS { get; set; }
    public string NFC { get; set; }
    public string radio { get; set; }
    public string USB { get; set; }
    public string sensors { get; set; }
    public string battery { get; set; }
    public string colors { get; set; }
    public decimal? Price { get; set; }
    public string Image { get; set; }
}

I don't know what am I doing wrong but after I update the database from nuget console, a new Category record is created per seeded product(phone). 我不知道我做错了什么但是在我从nuget控制台更新数据库后,每个种子产品(手机)都会创建一个新的类别记录 That's exactly the opposite of what I want. 这与我想要的完全相反。 I want all the phones to have one categoryId that refers to Phones category. 我希望所有的手机都有一个categoryId是指Phones类别。 does anyone know what's wrong? 有谁知道什么是错的?

分类表

电话表

Entity Type Configurations (fluent api): 实体类型配置(流畅的api):

public class CategoryConfiguration : EntityTypeConfiguration<Category>
{
    public CategoryConfiguration()
    {
        ToTable("Categories");
        HasKey(m => m.CategoryId);
    }
}

public class PhoneConfiguration : EntityTypeConfiguration<Phone>
{
    public PhoneConfiguration()
    {
        ToTable("Phones");
        HasKey(m => m.ProductId);
    }
}

Seed method: 种子方法:

protected override void Seed(BestPhone.Data.BestPhoneDbContext context)
{
       context.Categories.AddOrUpdate(new Category(){Name = "Phones", CategoryId = 1});
       ...
       //getting records from a csv file and holding them in an array.
       var records = csvReader.GetRecords<Phone>().ToArray();

       foreach (var record in records)
       {
           record.CategoryId = 1;
       }

       context.Phones.AddRange(records);
       context.SaveChanges();
   }
}

Try to add the next method on your CategoryConfiguration class: 尝试在CategoryConfiguration类上添加下一个方法:

    public void Configure(EntityTypeBuilder<Category> builder)
    {
        builder
            .HasMany(s => s.Products)
            .WithOne(t => t.Category)
            .HasForeignKey(t => t.CategoryId);
    }

I'm not sure but it seems a system does not take into account your foreign key during seeding. 我不确定,但似乎系统在播种期间没有考虑你的外键。

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

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