【问题标题】:Entity Framework incorrect seed实体框架不正确的种子
【发布时间】:2017-05-18 20:54:01
【问题描述】:

我有 2 个简单的模型类:

public class Category
{
    public int Id { get; set; }
    public string Description { get; set; }

    public ICollection<SubCategory> SubCategories { get; set; }
}

public class SubCategory
{
    public int Id { get; set; }
    public string Description { get; set; }

    public Category Category { get; set; }
}

还有一个简单的上下文:

public class SeederContext : DbContext
{
    public DbSet<Category> Categories { get; set; }
    public DbSet<SubCategory> SubCategories { get; set; }
}

我正在尝试播种以下 csv 文件

BetCategories.csv

Id,Description
1,Sports
2,Politics

BetSubCategories

Id,Category_Id,Description
1,1,Soccer
2,1,Basketball
3,1,Tennis
4,1,Poker
5,2,Election

我使用CsvHelper构建了一个播种机:

public void Seed(SeederContext context)
{
    SeedTable<Category>("../../Data/BetCategories.csv", t =>
    {
        context.Categories.AddOrUpdate(c => c.Id, t);
        context.SaveChanges();
    });

    SeedTable<SubCategory>("../../Data/BetSubCategories.csv", t =>
    {
        context.SubCategories.AddOrUpdate(c => new { c.Description}, t);
        context.SaveChanges();
    });
}

public void SeedTable<T>(string path, Action<T[]> callback)
{
    var filename = path;

    if (filename != null)
        using (var reader = new StreamReader(filename, Encoding.UTF8))
        {
            var csvReader = new CsvReader(reader);
            csvReader.Configuration.WillThrowOnMissingField = false;
            var list = csvReader.GetRecords<T>().ToArray();
            callback(list);
        }
}

播种子类别时出现问题。

在第一个种子 (Categories) 上运行正常,并将 2 个类别写入数据库。

在第二个种子上,SubCategories 正常,5 个子类别被写入数据库。但是,它们也被写入Categories 表 - 所以现在我总共有 2+5=7 个类别。

我不确定自己做错了什么。

这是一个非常简单的代码优先,根本不需要配置。

请指教。

小更新

手动播种时 - 它可以工作

SeedTable<Category>("../../Data/BetCategories.csv", t =>
{
    context.Categories.AddOrUpdate(c => c.Id, t);
    context.SaveChanges();
});

var subCategory = new SubCategory
{
    Category = context.Categories.FirstOrDefault(c => c.Description == "Sports"),
    Description = "Soccer"
};

context.SubCategories.AddOrUpdate(c => c.Description, subCategory);
context.SaveChanges();

subCategory = new SubCategory
{
    Category = context.Categories.FirstOrDefault(c => c.Description == "Sports"),
    Description = "Basketball"
};

context.SubCategories.AddOrUpdate(c => c.Description, subCategory);
context.SaveChanges();

【问题讨论】:

  • 合并。这就是我使用 AddOrUpdate 的原因

标签: c# entity-framework csvhelper


【解决方案1】:

我想知道这是否会解决

public class SubCategory
{
    public int Id { get; set; }
    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public string Description { get; set; }

    public virtual Category Category { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 2012-03-24
    • 2020-09-12
    • 1970-01-01
    • 2014-03-20
    相关资源
    最近更新 更多