views:

35

answers:

4

Hi,

I am somewhat confused on how to properly use LINQ in combination with an ASP.NET MVC strongly typed view.

My situation is as followed.

1) I retrieve a single object through LINQ 2) I pass this LINQ object to a strongly typed view. (edit form) 3) The user submits the form and the controller receives the LINQ object.

So my questions are:

1) Is the object the controller method receives after the submit still tight to the original datacontext or is it a newly created instance?

2) What is the preferred way to store the updated values in the database using LINQ. If it is still tight to the original datacontext a simple call to SubmitChanges() would be sufficient. But how to maintain the datacontext?

I would like to be able to save these data objects without having to use really ugly linq update statements. (Like retrieving the row again and manually update its values)

Any help, insights and preferably code samples would be appreciated.

Regards, Dennis

+1  A: 

You should fetch the existing object again, and update it, somthing like:

public ActionResult Edit(int ID)
        {
            DataEntity entity = _service.GetMyEntity(ID);                       

            UpdateModel(entity);

            //Saving code goes here.

            return View();
        }

The entity that you are talking about retrieving is no longer attached to the data context.

Paddy
+1  A: 

Is the object the controller method receives after the submit still tight to the original datacontext or is it a newly created instance?

It won't be attached to a DataContext at all on Submit.

What is the preferred way to store the updated values in the database using LINQ. If it is still tight to the original datacontext a simple call to SubmitChanges() would be sufficient. But how to maintain the datacontext?

The preferred way is to create a new DataContext, retreive the old object from the database, update the fields based on what was submitted to your Form, and then save the updated copy from the new Context.

Justin Niessner
A: 

Use your linq objects to get the data and put it into a POCO (plain old c# object) Model specifically for your view.

Your linq2sql/ef objects can be structured to store data which do not necessarily reflect your views

Your model can be updated and validated by the MVC framework by placing it in the call to the post.

public ActionResult EditPost(EditModel model)

When you have a valid model you can then transfer the data back to the database via your linq2sql/ef objects

if(ModelState.IsValid) // save to db

Create a DataContext when you need to load and save, don't persist it

Anthony Johnston
A: 

1) It is a new instance (through model binding feature) and it is not attached.

2) It depends, but the best would be probably new instance using(var context = new DBContext()) etc.

3) The most simple thing is fetch the object, pass in the updated values and SubmitChanges() (as you describe). Other option is described in this article. You create new instance of the object (or you have it from the model binding), attach it to the context and submit changes:

public ActionResult Test(MyModel model)
{
DbContext.Models.Attach(model);
DbContext.Refresh(RefreshMode.KeepCurrentValues, model);
DbContext.SubmitChanges();
}
jhexp