如何在不重复的情况下使用实体框架插入记录?

时间:2016-03-17 19:34:28

标签: entity-framework

到目前为止,我一直在寻找解决我的问题的方法,但没有任何成功。

这是我必须解决的问题。我有一个CSV文件,我通过StreamReader阅读。我在CSV中有一个字段,它根据文本的子字符串位置表示多个新列。

我的实体是Country,它具有Currency属性和Language属性,它们之间存在关系。 Country&之间存在一对多的关系。 Currency以及Country& Language

我需要阅读此CSV并将货币和语言插入各自的表格中,并使用插入的ID,该ID将填充我的LanguageId实体中的CurrencyIdCountry字段。

我目前遇到的问题是它在StreamReader的每一行插入一条记录。因此它将进入English几次,每次都有不同的ID进入语言表。

using (var ctx = new AddressLoader())
{
    if(!ctx.Currencies.Any())
    {
         string line = "";
         var counter = 0;

         Country country = new Country();

         using (StreamReader sr = new StreamReader("Country.csv"))
         {
             while (!sr.EndOfStream)
             {
                 line = sr.ReadLine();

                 TextFieldParser parser = new TextFieldParser(new StringReader(line));
                 parser.HasFieldsEnclosedInQuotes = true;
                 parser.SetDelimiters(",");

                 if (counter > 0)
                 {
                     country = GetCountryFromCSV(parser);
                     ctx.Countries.Add(country);
                 }

                 counter++;
             }
         }
     }

     ctx.SaveChanges();
}

我是Entity Framework的新手,我不确定如何编写它以便它会插入Country记录,检查语言或货币是否已经存在(不知道它的ID)并使用该ID关系。如果它尚不存在,它会将语言或货币插入表中,并使用新创建的Id作为关系。

我希望这是有道理的。谢谢!

1 个答案:

答案 0 :(得分:1)

使用货币作为示例并假设您在名称上匹配,在处理文件之前将现有货币集加载到字典中:

private IDictionary<string, Currency> _currencies;

using (var context = new DbContext)
{
    _currencies = context.Currencies.ToDictionary(k => k.Name.ToLower());
}

然后使用将从字典中检索现有货币或添加新货币的方法获取ID。

private int GetOrCreateCurrencyId(string currencyName)
{
    if (string.IsNullOrWhiteSpace(currencyName))
    {
        throw new ArgumentException();
    }

    var key = currencyName.ToLower();
    Currency currency;
    if (_currencies.TryGetValue(key, out currency))
    {
        return currency.CurrencyId;
    }

    using (var context = new DbContext())
    {
        currency = new Currency() { Name = currencyName };
        context.Currencies.Add(currency);
        context.SaveChanges();
        _currencies.Add(key, currency);
        return currency.CurrencyId;
    }
}