views:

93

answers:

3

Hello Everyone, I'm quite new to Linq and have had some problems updating my dabase. I don't know if it is actually happening for be using a global data context or I'm missing something. I have my typed DataContex and one Static Public Var to initialize it located within the namespace AlpaCommon, like following:

My partial datacontext***************

// partial datacontext class
namespace
AlpaCommon
{
public partial class AlpaDataContext : System.Data.Linq.DataContext
{

//Insert method is working...
public void InsertAnimal2(Animal instance)
{
Animais.InsertOnSubmit(instance);
SubmitChanges();
} 

//Delete method is working...
public void DeleteAnimal2(int animalID)
{
var animal = (from a in Animais where a.AnimalID == animalID select a).First();
Animais.DeleteOnSubmit(animal);
SubmitChanges();
}



//Update method IS NOT working...
public void UpdateAnimal2(Animal newAnimal)
{.
var animal = (from a in Animais where a.AnimalID == newAnimal.AnimalID select a).First();
animal = newAnimal;
SubmitChanges();
}

This is where I'm instanciating the datacontext e other variables I'll need in the whole app*********

//global DataContext instance
namespace AlpaCommon
{
public static class Globals
{
public static AlpaDataContext db = new AlpaDataContext();

This is the call to the update method **************************

using AlpaCommon;
namespace Animais
{
public partial class Altera : System.Web.UI.Page
{

protected void btnUpdate_Click(object sender, EventArgs e)
{
try
{

//cria um novo Objeto do tipo Animal
Animal animalAltera = new Animal();
//set new values 
animalAltera.AnimalID = Convert.ToInt32(Request.Params["AnimalID"]);
animalAltera.Castrado = CastradoCheckBox.Checked;
animalAltera.DisponivelAdocao = DisponivelCheckBox.Checked;
animalAltera.Adotado = AdotadoCheckBox.Checked;
animalAltera.Nome = NomeTextBox.Text;
animalAltera.Tipo = TipoDropDownList.SelectedValue;
animalAltera.Sexo = SexoDropDownList.SelectedValue;
animalAltera.Descricao = DescricaoTextBox.Text;
animalAltera.Local = LocalTextBox.Text;
animalAltera.Foto = AlteraFoto(); 

AlpaCommon.Globals.db.UpdateAnimal2(animalAltera);

redirect = redirectSucesso;

}
catch
{
redirect = redirectErro;
}
finally
{

Helper.Redirect(redirect);
}
}


I'm not catching any exception, it just does not update the database. Am I missing something in my updating or calling method? I'm looking forward for suggestions.

Thank you

Josimari Martarelli

+1  A: 

The problem is in your animal = newAnimal; statement in UpdateAnimal2. Remember that animal in that context is just a reference, and you're just assigning that reference to an animal that is not connected to your DataContext. Get the animal from your dataContext first instead of calling animalAltera = new Animal(); THEN, call SubmitChanges(). Or, you could use the Attach() method of the DataContext to attach your new Animal() object and then submit.

Dave Markle
A: 

In your UpdateAnimal2() method, note that the DataContext is associated with animal prior to its assignment. The DataContext remains associated with that animal after the assignment, but the variable simply points to a different object. The DataContext knows nothing about this new object, and in fact, would have problems handling it if that object was created by a different DataContext. Instead, you should assign all of animal's properties to match the properties of newAnimal. An assignment does not accomplish anything in this context.

JoshJordan
A: 

Hi

Copying each property from the new to the old object worked fine:

public void UpdateAnimal2(Animal animalAltera)

{

// Query for a specific animal.

var animal =(from a in Animais

where a.AnimalID == animalAltera.AnimalID

select a).First();

animal.AnimalID = animalAltera.AnimalID;

animal.Castrado = animalAltera.Castrado;

animal.DisponivelAdocao = animalAltera.DisponivelAdocao;

animal.Adotado = animalAltera.Adotado;

animal.Nome = animalAltera.Nome;

animal.Tipo = animalAltera.Tipo;

animal.Sexo = animalAltera.Sexo;

animal.Descricao = animalAltera.Descricao;

animal.Local = animalAltera.Local;

animal.Foto = animalAltera.Foto;

SubmitChanges();

}

Attaching doesn't work because I don't have a timestamp field and don't think it is necessary for now. (I'll have one user admin updating the homepage) The only thing that bothers is that assigning each property from the new to the old object will require additional work if I have changes in my table structure... Thank you!!!