Ссылка на Sql - Проблемы при обновлении базы данных - PullRequest
1 голос
/ 17 июля 2009

Я новичок в Linq, и у меня возникли проблемы с обновлением базы данных. Я не знаю, действительно ли это происходит из-за использования глобального контекста данных или я что-то упустил. У меня есть типизированный DataContex и одна статическая общедоступная переменная для его инициализации, расположенная в пространстве имен 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();
}

Здесь я создаю экземпляр текста данных и других переменных, которые мне понадобятся во всем приложении. *************

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

Я не ловлю никаких исключений, он просто не обновляет базу данных. Я что-то упустил в своем обновлении или вызове метода? Я с нетерпением жду предложений.

Спасибо

Йосимари Мартарелли

Ответы [ 3 ]

1 голос
/ 17 июля 2009

Проблема в вашем животном = newAnimal; заявление в UpdateAnimal2. Помните, что animal в этом контексте - просто ссылка, и вы просто назначаете эту ссылку животному, которое не связано с вашим DataContext. Сначала получите животное из вашего dataContext вместо вызова animalAltera = new Animal (); ТО, вызовите SubmitChanges (). Или вы можете использовать метод Attach () объекта DataContext, чтобы присоединить новый объект Animal () и затем отправить его.

0 голосов
/ 17 июля 2009

Копирование каждого свойства из нового в старый объект работало нормально:

public void UpdateAnimal2 (Animal animalAltera)

{

// Запрос для конкретного животного.

var animal = (из Анимаис

где a.AnimalID == animalAltera.AnimalID

выберите а) .Первый ();

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;

* +1034 * SubmitChanges (); * 1 035 *

}

Присоединение не работает, потому что у меня нет поля метки времени и я не думаю, что это необходимо сейчас. (У меня будет один пользователь-админ, обновляющий домашнюю страницу) Единственное, что беспокоит, это то, что назначение каждого свойства от нового к старому объекту потребует дополнительной работы, если у меня есть изменения в структуре моей таблицы ... Спасибо !!!

0 голосов
/ 17 июля 2009

В вашем методе UpdateAnimal2 () обратите внимание, что DataContext связан с animal до его назначения. DataContext остается связанным с этим animal после назначения, но переменная просто указывает на другой объект. DataContext ничего не знает об этом новом объекте и, фактически, будет иметь проблемы с его обработкой, если этот объект был создан другим DataContext. Вместо этого вы должны присвоить всем животным свойства, соответствующие свойствам newAnimal . Назначение ничего не выполняет в этом контексте.

...