链接到Sql - 更新数据库的问题

时间:2009-07-17 04:10:44

标签: c# asp.net linq-to-sql

我对Linq很新,并且在更新我的dabase时遇到了一些问题。 我不知道是否真的发生了使用全局数据上下文或者我错过了什么。 我有我的类型DataContex和一个Static Public Var来初始化它位于命名空间AlpaCommon中,如下所示:

我的部分数据文字*******************

// 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();
}

这是我在整个应用程序中实现datacontext e其他变量的地方*************

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

这是对更新方法的调用******************************

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);
}
} 

我没有捕获任何异常,它只是不更新​​数据库。我在更新或调用方法中遗漏了什么?我期待着提出建议。

谢谢

Josimari Martarelli

3 个答案:

答案 0 :(得分:1)

问题在于你的动物= newAnimal; UpdateAnimal2中的语句。请记住,该上下文中的动物只是一个参考,您只是将该引用分配给未连接到DataContext的动物。首先从dataContext获取动物,而不是调用animalAltera = new Animal();然后,调用SubmitChanges()。或者,您可以使用DataContext的Attach()方法附加新的Animal()对象,然后提交。

答案 1 :(得分:0)

在UpdateAnimal2()方法中,请注意DataContext在分配之前与 animal 相关联。在赋值之后,DataContext仍与该动物相关联,但该变量只是指向不同的对象。 DataContext对这个新对象一无所知,事实上,如果该对象是由不同的DataContext创建的,那么处理它会有问题。相反,您应该指定所有 animal的属性以匹配 newAnimal 的属性。在这种情况下,作业无法完成任何任务。

答案 2 :(得分:0)

将每个属性从新对象复制到旧对象的工作正常:

public void UpdateAnimal2(Animal animalAltera)

{

//查询特定动物。

var animal =(来自Animais中的a

其中a.AnimalID == animalAltera.AnimalID

选择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();

}

附加不起作用,因为我没有时间戳字段,现在认为不需要。 (我将有一个用户管理员更新主页) 唯一令人烦恼的是,如果我的表结构发生了变化,那么将每个属性从新对象分配到旧对象将需要额外的工作... 谢谢!!!