I have two tables with a Many-To-Many relationship like this:
User(emailaddress, Name)
UserAlerts(emailaddress, AlertId)
Alert(AlertId,Title)
Alerts have already been added to the database. When inserting a new user, I am doing a lookup on the AlertRepository. The problem is, Instead of creating a record in the User and the UsertAlerts tables only, its also adding an extra Alert record.
I am using the following code:
public ActionResult Register(UserModel model, int[] Alerts)
User user = new MidTier.Models.User();
user.Name = model.Name;
user.EmailAddress = model.EmailAddress;
if (Alerts!=null)
{
IRepository<Alert> alertRepository = new AlertRepository();
foreach (int alertId in Alerts)
{
Alert alert = alertRepository.First(a=>a.ID== alertId);
alertRepository.Detach(alert);
if (alert != null)
{
alert.Enabled = true;
user.Alerts.Add(alert);
}
}
}
userRepository.Attach(user);
userRepository.Add(user);
userRepository.Save();
Why don’t you try to search little bit before you ask a question? This problem is asked several times per week. In your previous question I said you that you should use same context for loading
Alertand storingUser. You didn’t do it and complicated whole situation.The context doesn’t know anything about existence of the alert. Once you call
Addfor user it will add all entities which are not tracked yet. There are three ways to solve this:Alertto the new context before you add it toUser. That is hard to do when you wrap EF code to repositories.Alertto the new context before you add it toUseryou must modify yourAddmethod forUserand after addingUserto the context you must iterate every alert and change its state toUnchanged.