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