更有效地处理实体的编辑和保存

本文关键字:编辑 保存 实体 有效地 处理 | 更新日期: 2023-09-27 18:21:19

我正试图在同一屏幕上保存和编辑一条记录,但我认为我的逻辑有点混乱,因为他们使用实体框架来做这件事的更好方法是,我记得有一两次遇到了一个详细的方法。

  protected void btnSave_Click(object sender, EventArgs e)
     {   
   player _player = new player();
        Guid id = new Guid(Request.QueryString["id"].ToString());
        Guid teamId = new Guid(Request.QueryString["teamId"].ToString());
        if (teamId != Guid.Empty)
            _player.teamId = teamId;

        if (id == Guid.Empty)
        {
            _player.Name = txtFullName.Text;
            _player.address = txtAddress.Text;
            _player.player_id = _dal.GetNextPlayerId(16, 45);
            _player.gender = dlGenders.SelectedValue.ToString();
            _dal.SoccerEntities.AddToplayers(_player);
            _dal.SoccerEntities.SaveChanges();
            Response.Redirect("default.aspx");
        }
        else
        {
            Guid _playerId = new Guid(Request.QueryString["id"].ToString());
            _player = _dal.GetPlayerBYID(_playerId);
            if (_player.player_id == "")
                _player.player_id = _dal.GetNextPlayerId(16, 45);
            _player.gender = dlGenders.SelectedValue.ToString();
            _player.Name = txtFullName.Text;
            _player.address = txtAddress.Text;
            _player.player_id = _dal.GetNextPlayerId(16, 45);
            _player.gender = dlGenders.SelectedValue.ToString();
            if (teamId != Guid.Empty)
                _player.teamId = teamId;

            _dal.SoccerEntities.SaveChanges();

            Response.Redirect("default.aspx");
        }

第二个问题是,如果玩家已经编辑了他们的记录,而不是添加新的记录,那么玩家可能存在,也可能不存在?。

我在addtoplayers 上也得到了一个错误

{"违反PRIMARY KEY约束'PK_player'。无法在对象'dbo.player'中插入重复的密钥。重复的密钥值为(00000000-0000-0000-0000-000000000)。''r''n语句已终止。"}

更有效地处理实体的编辑和保存

在这种情况下,分离对您没有帮助。您应该保持连接,以便更改跟踪可以跟踪添加、修改和删除的实体,以便在SaveChanges()方法中使用。

您的主键错误可能是由于GetNextPlayerId()函数造成的。它似乎正在返回一个默认的Guid(),并且您的数据库中已经有一个默认Guid(。确保它返回一个未使用的ID,或者Guid.NewGuid(),它几乎可以保证是唯一的。

GetNextPlayerId()函数的一个可能更好的替代方案是,在插入新行时,在数据库中使用触发器或自动递增属性来自动设置关键字。使用实体框架,您可以在实体上指定DatabaseGeneratedOption = Identity数据注释。

对于您的事件处理程序,我将删除代码中的冗余,如下所示。

   protected void btnSave_Click(object sender, EventArgs e)
    {
        player _player;
        Guid id = new Guid(Request.QueryString["id"].ToString());
        Guid teamId = new Guid(Request.QueryString["teamId"].ToString());            
        if (id != Guid.Empty)
        {
            //get existing player
            _player = _dal.GetPlayerBYID(_playerId);
            if(_player == null)
                  throw new Exception(String.Format("Player: {0} not found.", _playerId));
        }
        else
        {
            //get new player
            _player = new player();
            //set key
            _player.player_id = _dal.GetNextPlayerId(16, 45);
            //add to dbset
            _dal.SoccerEntities.AddToplayers(_player);
        }
        //set properties
        if (teamId != Guid.Empty)
            _player.teamId = teamId;
        _player.Name = txtFullName.Text;
        _player.address = txtAddress.Text;
        _player.gender = dlGenders.SelectedValue.ToString();
        //save and redirect
        _dal.SoccerEntities.SaveChanges();
        Response.Redirect("default.aspx");
    }