如何解决更新数据库时的 Stackoverflow
我正在播种一类汽车,其中有一个模型类(带有 int 属性 ModelId)和一个品牌类(再次带有 ClassId)。从 .csv 表中读取种子。我怀疑问题出在外键上,或者我必须在其他地方建立适当的关系,但我为此付出了很多努力。
我的解析器如下:
public static class CarSeeder
{
public static void Seed(this ModelBuilder modelBuilder)
{
var data = LoadData();
var models = CreateModels(data);
modelBuilder.Entity<Model>().HasData(models);
var brands = CreateBrands(data);
modelBuilder.Entity<Brand>().HasData(brands);
var cars = CreateCars(data,brands,models);
modelBuilder.Entity<Car>().HasData(cars);
//modelBuilder.Entity<Car>(b =>
//{
// b.HasData(cars);
// b.HasOne(e => e.Brand).WithMany(x=>x.Cars).HasForeignKey(x=>x.BrandId);
// b.HasOne(z => z.Model).WithMany(x=>x.Cars).HasForeignKey(x => x.ModelId);
//});
// }
}
private static List<Dictionary<string,string>> LoadData()
{
var cars = new List<Dictionary<string,string>>();
var path = @"D:\the path of the file";
using (textfieldparser parser = new textfieldparser(path))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
var car = new Dictionary<string,string>();
string[] fields = parser.ReadFields();
car.Add("make",fields[46]);
car.Add("year",fields[63]);
car.Add("model",fields[47]);
car.Add("type",fields[62]);
car.Add("fuel",fields[31]);
car.Add("trany",fields[57]);
car.Add("cyllinders",fields[22]);
cars.Add(car);
}
}
return cars;
}
private static List<Model> CreateModels(List<Dictionary<string,string>> carColl)
{
var countryNames = GetUniqueColumnValues(carColl,column: "model");
var models = new List<Model>();
var idCounter = 1;
foreach (var name in countryNames)
{
models.Add(new Model() { Id = idCounter++,Name = name });
}
return models;
}
private static List<Brand> CreateBrands(List<Dictionary<string,string>> carColl)
{
var brands = GetUniqueColumnValues(carColl,column: "make");
var brandList = new List<Brand>();
var counter = 1;
foreach (var name in brands)
{
brandList.Add(new Brand() { Id = counter++,Name = name });
}
return brandList;
}
private static HashSet<string> GetUniqueColumnValues(List<Dictionary<string,string>> table,string column)
{
var uniqueValues = new HashSet<string>();
foreach (var row in table)
{
uniqueValues.Add(row[column]);
}
return uniqueValues;
}
private static List<Car> CreateCars(List<Dictionary<string,string>> carColl,List<Brand> brands,List<Model> models)
{
var carMod = new List<Car>();
var counter = 1;
foreach (var car0 in carColl)
{
var brand = brands.Where(x => x.Name == car0["make"]).FirstOrDefault().Id;
var model = models.Where(x => x.Name == car0["model"]).FirstOrDefault().Id;
var car = new Car()
{
Id = counter,ModelId = model,BrandId = brand,Cyllinders = car0["cyllinders"],Fuel = car0["fuel"],Type= car0["type"],Year =car0["year"],Transmission = car0["trany"],};
carMod.Add(car);
counter++;
}
return carMod;
}
}
}
OnModelCreating
中的关系如下。
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
//builder.Entity<Car>().HasKey(k => k.Id);
//builder.Entity<Model>().HasKey(k => k.Id);
//builder.Entity<Brand>().HasKey(k => k.Id);
//builder.Entity<Brand>().HasMany(x => x.Cars).WithOne(x => x.Brand).HasForeignKey(x => x.BrandId);
//builder.Entity<Model>().HasMany(x => x.Cars).WithOne(x => x.Model).HasForeignKey(x => x.ModelId);
builder.Entity<Repair>().HasKey(k => k.Id);
builder.Entity<Log>().HasKey(k => k.Id);
builder.Entity<IdentityRole>().HasData(SeedRoles.Roles);
builder.Seed();
builder.SeedCounties();
builder.SeedRepairs();
}
有没有人知道这种关系有什么问题?当我尝试更新数据库时,它会在 PM 控制台中引发 Stack Overflow。我在创建汽车时尝试使用非常模型而不是他们的 ID,但无济于事。 提前致谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。