我有产品类:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Language> Languages { get; set; }
}
语言课程:
public class Language
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
在我的EntityTypeConfiguration中:
public class ProductMap : EntityTypeConfiguration<Product>
{
public ProductMap()
{
HasKey(m => m.Id);
Property(p => p.Name).IsRequired();
HasMany(p => p.Languages)
.WithMany(l => l.Products)
.Map(x => x.ToTable("ProducLanguages")
.MapLeftKey("ProductId")
.MapRightKey("LanguageId"));
//Table
ToTable("Products");
}
}
这会按预期创建第三个表,但是当我使用以下种子执行update-database时:
protected override void Seed(EcoomerceContext context)
{
var languages = new List<Language>
{
new Language {Name = "Portuguese"},
new Language {Name = "English"},
new Language {Name = "Spanish"}
};
var languagePt = new List<Language>
{
new Language {Name = "Portuguese"},
};
//languages.ForEach(a => context.Languages.Add(a));
new List<Product>
{
new Product {Name = "NameProduct1", Languages = languages},
new Product {Name = NameProduct2 , Languages = languagePt},
}.ForEach(a => context.Products.Add(a));
context.SaveChanges();
}
它会像这样更新关系表ProducLanguages:
它正在插入一种不存在的语言(编号4),我期望的结果是:
我做错了什么?
提前致谢。
答案 0 :(得分:1)
您需要指定每个实体的Id
,即使PK是Identity。指定将在数据库中使用的Id
是至关重要的,否则每个Update-Database
将创建新记录。
此外,您应该使用在迁移期间为种子数据创建的AddOrUpdate
扩展方法。在此方法中,您可以指定一个表达式,以了解应该使用哪个属性来检查是否必须执行{{1}或Add
操作,但如果您未在实体中指定Update
,则会添加一个新行,旧行也将保留。最后,您的Id
方法可能就是这样:
Seed