0

I have the following code which connected to my database, and checks if an email address exists in a Table, if it does, it will delete it, if it doesn't, it will add it.

But neither options work. I get the same error for both actions:

The object cannot be deleted because it was not found in the ObjectStateManager.

The code:

protected OEntities database = new OEntities();

public string NewsletterSubscriptionValidation(string emailAddress)
{
    string validationMessage = "";
    Newsletter newsletter = new Newsletter();

    var identifier = database.Newsletters.Select(
        id => id.EmailAddress);

    if (identifier == null)
    {
        newsletter.EmailAddress = emailAddress;
        newsletter.Subscribed = true;

        database.Newsletters.AddObject(newsletter);
        database.SaveChanges();

        validationMessage = "You are now subscribed to our periodic Newsletter.";
    }
    else
    {
        newsletter.EmailAddress = emailAddress;
        newsletter.Subscribed = false;


        database.DeleteObject(newsletter);
        database.SaveChanges();

        validationMessage = "You have been unsubscribed from our periodic Newsletter.";
    }

    return validationMessage;
}

Am I even adding to/deleting from the Database the right way, here?

Solution


protected OEntities database = new OEntities();

public string NewsletterSubscriptionValidation(string emailAddress)
{
    string validationMessage = "";
    Newsletter newsletter = database.Newsletters.FirstOrDefault(
        nl => nl.EmailAddress == emailAddress);

    if (newsletter == null)
    {
        newsletter = new Newsletter();

        newsletter.EmailAddress = emailAddress;
        newsletter.Subscribed = true;

        database.AddToNewsletters(newsletter);
        //database.Newsletters.AddObject(newsletter);
        database.SaveChanges();

        validationMessage = "You are now subscribed to our periodic Newsletter.";
    }
    else
    {
        newsletter.EmailAddress = emailAddress;
        newsletter.Subscribed = true;

        database.AddToNewsletters(newsletter);
        //database.Newsletters.AddObject(newsletter);
        database.SaveChanges();

        validationMessage = "You have been unsubscribed from our periodi Newsletter.";
    }

    return validationMessage;
}
Arrow
  • 2,784
  • 8
  • 38
  • 61

1 Answers1

1

You need to attach before you delete

    database.Attach(newsletter); 
    database.DeleteObject(newsletter); 
    database.SaveChanges(); 

but you probably want to select the existing item more like this

Newsletter newsletter = database.Newsletters.FirstOrDefault(nl => nl.EmailAddress == emailAddress);
if (newsletter == null)
{
    newsletter = new Newsletter();
    ...
}
else
{
    database.Attach(newsletter); 
    database.DeleteObject(newsletter); 
    database.SaveChanges(); 
}
podiluska
  • 50,950
  • 7
  • 98
  • 104
  • "Attach" - oh, thank you. Much appreciated :-) I will try that out now! – Arrow Jul 25 '12 at 11:37
  • sorry, but that did no work. It said: `An object with a null EntityKey value cannot be attached to an object context.` – Arrow Jul 25 '12 at 11:39
  • Ok, thankyou, now we getting somewhere. Not working yet, but atleast now it detected that there is no suck emailAddress in database. It now says `Object reference not set to an instance of an object.` when it tries to add email address with: `newsletter.EmailAddress = emailAddress;` – Arrow Jul 25 '12 at 11:53
  • @EvilCokeMachine Yes - because now newsletter is null. You need to new Newsletter before setting the values... – podiluska Jul 25 '12 at 11:57
  • Just tried your edit, `newsletter = new Newsletter();` results in: `An object with a null EntityKey value cannot be attached to an object context.` – Arrow Jul 25 '12 at 12:03
  • @EvilCokeMachine That's here, I think http://stackoverflow.com/questions/700192/how-do-can-i-attach-a-entity-framework-object-that-isnt-from-the-database – podiluska Jul 25 '12 at 12:05
  • I got rid of `database.AddObject(entity);` and replaced it with `database.AttachTo("Newsletters", newsletter);` and it works. Except that it just doesn't delete from or add to the database :-/ – Arrow Jul 25 '12 at 12:09