Ich muss adin Benutzer in eine Tabelle (und untergeordnete Tabelle) hinzufügen, wo sie nicht bereits vorhanden sind.
Ich habe den folgenden Code, der den Fehler auslöst: "Sammlung wurde geändert; Aufzählungsvorgang möglicherweise nicht ausgeführt." in der Zeile "_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();
Ich habe ähnliche Beiträge zu SO gesehen, aber in jedem Fall scheinen sie über die Sammlung zu iterieren, in die sie eingefügt werden. In meinem Fall versuche ich nur, über eine Liste von Strings zu iterieren.
Was habe ich falsch gemacht?
Nun zu folgendem bearbeitet (immer noch der gleiche Fehler):
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 wird wie folgt als Domänenentität definiert:
public virtual ICollection<UserView> UserViews { get; set; }
Um diese Arbeit zu machen, wechselte ich von
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() };
Um ehrlich zu sein, ich weiß nicht, warum die .ToList () benötigt wird - wenn das jemand tut, dann denke ich, dass eine Erklärung für viele hilfreich sein kann!
Nur für den Vorschlag ist es besser, verwenden Sie einen Ersatz der Anzahl . alle arbeiten viel schneller als zählen. benutze diesen Code
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
});
}
Ersetzen wenn
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
});
}