Мне нужно добавить пользователей adin в таблицу (и дочернюю таблицу), где они еще не существуют.
У меня есть следующий код, который вызывает ошибку: «Коллекция была изменена, операция перечисления не может выполняться». на строке "_userPrefsContext.UserRecs.Add (userRec);"
var allUserRecs = _userPrefsContext.UserRecs.ToList();
foreach (string adminUser in adminUsers.Where(x => x.Length > 0))
{
domain = adminUser.Split('\\')[0];
login = adminUser.Split('\\')[1];
var userRec = new Domain.UserPrefs.BamUser()
{
AdLogonDomain = domain,
AdLogonId = login,
UserViews = colUserView
};
if (allUserRecs.Where(x => x.AdLogonDomain == domain
&& x.AdLogonId == login).Count() == 0)
{
//don't currently have a user rec for this login so create one
_userPrefsContext.UserRecs.Add(userRec);
}
}
_userPrefsContext.SaveChanges();
Я видел похожие сообщения на SO, но в каждом случае они, похоже, повторяют коллекцию, в которую они добавляются. В моем случае я просто пытаюсь перебрать список строк.
Где я неправ?
Теперь отредактировано до следующего (по-прежнему такая же ошибка):
List<string> adminUsers = WebConfigurationManager.AppSettings["AdminUsers"].Split(';').ToList();
adminUsers = adminUsers.Where(x => x.Length > 0).ToList();
string domain = "", login = "";
string userViewString = Helpers.ViewNames.UserView.ToString();
int viewId = _userPrefsContext.ViewRecs.Where(x => x.Name == userViewString).Select(x => x.BamViewId).Single();
Domain.UserPrefs.UserView userView = new Domain.UserPrefs.UserView()
{
BamViewId = viewId
};
List<Domain.UserPrefs.UserView> colUserView = new List<Domain.UserPrefs.UserView>();
colUserView.Add(userView);
var allUserRecs = _userPrefsContext.UserRecs.ToList();
string[] users = new string[adminUsers.Count()];
int y = 0;
foreach(string user in adminUsers)
{
users[y] = user;
y++;
}
int total = adminUsers.Count;
for (var i = 0; i < total; i++)
{
domain = users[i].Split('\\')[0];
login = users[i].Split('\\')[1];
if (allUserRecs.Where(x => x.AdLogonDomain == domain
&& x.AdLogonId == login).Count() == 0)
{
//don't currently have a user rec for this login so create one
_userPrefsContext.UserRecs.Add(new Domain.UserPrefs.BamUser()
{
AdLogonDomain = domain,
AdLogonId = login,
UserViews = colUserView
});
}
}
_userPrefsContext.SaveChanges();
UserViews определяется как объект домена следующим образом:
public virtual ICollection<UserView> UserViews { get; set; }
Чтобы сделать эту работу, я изменил
var userRec = new Domain.UserPrefs.BamUser()
{
AdLogonDomain = domain,
AdLogonId = login,
UserViews = colUserView
};
to var userRec = new Domain.UserPrefs.BamUser() { AdLogonDomain = domain, AdLogonId = login, UserViews = colUserView.ToList() };
Честно говоря, я не знаю, зачем нужен .ToList () - если кто-то делает это, я думаю, что объяснение может быть полезным для многих!
Просто для предложения лучше, если вы используете любую замену счетчика . любая работа намного быстрее, чем счет. используйте этот код
if (!allUserRecs.any(x => x.AdLogonDomain == domain && x.AdLogonId == login))
{
//don't currently have a user rec for this login so create one
_userPrefsContext.UserRecs.Add(new Domain.UserPrefs.BamUser()
{
AdLogonDomain = domain,
AdLogonId = login,
UserViews = colUserView
});
}
Заменить, если
if (allUserRecs.Where(x => x.AdLogonDomain == domain
&& x.AdLogonId == login).Count() == 0)
{
//don't currently have a user rec for this login so create one
_userPrefsContext.UserRecs.Add(new Domain.UserPrefs.BamUser()
{
AdLogonDomain = domain,
AdLogonId = login,
UserViews = colUserView
});
}