views:

35

answers:

2

Hey everyone,

I'm haing a few problems updating a row in my database using Linq2Sql.

Inside of my model I have two methods for updating and saving from my controller, which in turn receives an updated model from my view.

My model methods like like:

public void Update(Activity activity)
        {
            _db.Activities.InsertOnSubmit(activity);
        }

public void Save()
        {
            _db.SubmitChanges();
        }

and the code in my Controller likes like:

[HttpPost]
        public ActionResult Edit(Activity activity)
        {
            if (ModelState.IsValid)
            {
                UpdateModel<Activity>(activity);
                _activitiesModel.Update(activity);
                _activitiesModel.Save();
            }
            return View(activity);
        }

The problem I'm having is that this code inserts a new entry into the database, even though the model item i'm inserting-on-submit contains a primary key field.

I've also tried re-attaching the model object back to the data source but this throws an error because the item already exists.

Any pointers in the right direction will be greatly appreciated.

UPDATE:

I'm using dependancy injection to instantiate my datacontext object as follows:

IMyDataContext _db;

        public ActivitiesModel(IMyDataContext db)
        {
            _db = db;
        }
A: 

There should be an insert in case of the InsertOnSubmit method usage, this is an expected behaviour.
We recommend the Attach() method usage in your Update() method implementation. In case you have IsVersion column in the entity then everything is simple, in the other case you will have to pass the original values also to the Attach call. More information is available here in MSDN.

Devart
A: 

I fixed this issue by re-obtaining and updating my object in the Update method.

Instead of trying to re-attach or get the data context to realise it was the same object that belonged to it before I basically did as follows:

[HttpPost]
        public ActionResult Edit(Activity activity)
        {
          Activity myActivity = activitiesModel.getActivityById(activity.id);
          myActivity.name = activity.name;
          myActivity.date = activity.date;
          _dbContext.SubmitChanges();
          return View(activity);
        }

This isn't my exact code and to be more precise, I created another partial class to my datacontext and stored my update code in there.

Jamie Dixon