到目前为止,我一直在寻找解决我的问题的方法,但没有任何成功。
这是我必须解决的问题。我有一个CSV文件,我通过StreamReader
阅读。我在CSV中有一个字段,它根据文本的子字符串位置表示多个新列。
我的实体是Country
,它具有Currency
属性和Language
属性,它们之间存在关系。 Country
&之间存在一对多的关系。 Currency
以及Country
& Language
。
我需要阅读此CSV并将货币和语言插入各自的表格中,并使用插入的ID,该ID将填充我的LanguageId
实体中的CurrencyId
或Country
字段。
我目前遇到的问题是它在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作为关系。
我希望这是有道理的。谢谢!
答案 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;
}
}