更新时的asp.net mvc System.Data.Linq.DuplicateKeyException

时间:2009-09-18 02:16:48

标签: asp.net-mvc linq-to-sql

我正在使用带有linq到sql存储库的asp.net mvc,以下代码在this._table.Attach(entity)上抛出一个mvc System.Data.Linq.DuplicateKeyException异常

我的代码是这样的:

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

    }

请注意,Id不是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 :(得分:0)

我认为问题在于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/