asp.net mvc System.Data.Linq.DuplicateKeyException при обновлении - PullRequest
0 голосов
/ 18 сентября 2009

Я использую asp.net mvc с linq to sql репозиториями, и следующий код создает исключение mvc System.Data.Linq.DuplicateKeyException для this._table.Attach (entity)

Мой код выглядит примерно так:

    public ActionResult Edit(int id)
    {
        return View(_controllerRepository.GetById(id));
    }

    public ActionResult Edit(Directivo entity)
    {
        try
        {
         _repository.Save(entity, this.UserName)

        }
        catch (Exception ex)
        {
            return View(ex);
        }
    }

А в репозитории:

    public virtual void Save(T entity, string userName)
    {
        if (0 == entity.Id)
        { 
            entity.UsuarioIntroduccion = userName;
            entity.FechaIntroduccion = DateTime.Now;
            entity.UsuarioModificacion = null;
            entity.FechaModificacion = null;

            this._table.InsertOnSubmit(entity);
        }
        else
        {
            entity.UsuarioModificacion = userName;
            entity.FechaModificacion = DateTime.Now;

            this._table.Attach(entity);
            this._table.Context.Refresh(RefreshMode.KeepCurrentValues, entity);
        }
        try
        {
            this._dataContext.SubmitChanges();
        }
        catch (SqlException ex)
        {
            throw new DataContextException(ex);
        }

    }

Обратите внимание, что идентификатор не равен 0.

Это действительно странно, потому что это происходит только с этим классом, у меня есть еще пара, которые работают хорошо.

Таблица такова:

CREATE TABLE [Directivo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Nombre] [varchar](45) NOT NULL,
    [Apellidos] [varchar](60) NOT NULL,
    [FechaNacimiento] [datetime] NULL,
    [CargoDirectivoId] [int] NOT NULL,
    [PathImagen] [varchar](250) NULL,
    FechaIntroduccion datetime not null,
    UsuarioIntroduccion varchar(45) not null,
    FechaModificacion datetime,
    UsuarioModificacion varchar(45),
    PRIMARY KEY (Id),
    FOREIGN KEY (CargoDirectivoId)
        REFERENCES CargoDirectivo(Id)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION 
)

И этот класс автоматически генерируется linq и частичным классом, который заставляет его наследовать интерфейс и устанавливает для метаданных класс друзей для использования xVal

Есть ли у вас какие-либо подсказки о том, что может происходить?

Заранее спасибо!

1 Ответ

0 голосов
/ 05 июня 2011

Я думаю, что проблема в this._table.Attach(entity); передвиньте эту строку вверх перед установкой новых значений следующим образом

public virtual void Save(T entity, string userName)
{
    if (0 == entity.Id)
    { 
        entity.UsuarioIntroduccion = userName;
        entity.FechaIntroduccion = DateTime.Now;
        entity.UsuarioModificacion = null;
        entity.FechaModificacion = null;

        this._table.InsertOnSubmit(entity);
    }
    else
    {
        this._table.Attach(entity);

        entity.UsuarioModificacion = userName;
        entity.FechaModificacion = DateTime.Now;

        this._table.Context.Refresh(RefreshMode.KeepCurrentValues, entity);
    }
    try
    {
        this._dataContext.SubmitChanges();
    }
    catch (SqlException ex)
    {
        throw new DataContextException(ex);
    }

}

и это может вам помочь http://www.richardbushnell.net/2008/02/18/how-to-update-data-with-linq-to-sql/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...