2015-11-10 24 views
0

我试图在同一屏幕上保存和编辑记录,但我认为我的逻辑有点搞砸是他们使用实体框架来做这件事的一种更好的方法,我remebmer遇到了一次或两次侦听的方法。更有效的方式处理编辑和实体保存?

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

     } 

的secnerio是一个球员可能会或可能不会,如果他们已经自己编辑自己的记录,而不是添加一个新的存在?

我也混得addtoplayers错误

{“PRIMARY KEY约束 'PK_player'。违反无法插入对象 'dbo.player' 重复键,重复的键值是(00000000-0000 -0000-0000-000000000000)。\ r \ n声明已被终止。“}

+0

是什么id'的'的价值,当你通过代码..也'默认Empty.Guid'步骤是这样的'{} 00000000-0000-0000-0000-000000000000'可以请你展示一下这些值是我们可以帮助你重构你的逻辑陈述。错误信息也告诉你问题是什么......你已经在主键字段中使用了“{00000000-0000-0000-0000-000000000000}”的值,并且在创建“主键”时不允许重复 – MethodMan

+0

也应该围绕'try {} catch {}包装'SaveChanges'调用并对Response.Redirect(“default.aspx”)进行一次调用;有几种方法可以重构此代码,以便不会有多次调用相同的方法 – MethodMan

+0

@MethodMan可以提供一个我在这里可以使用的类似\t \t if(EntityState == EntityState.Detached)来检测它的重构示例新的记录或现有的记录 – rogue39nin

回答

1

Detaching在这种情况下不会帮助您。您应该保持连接状态,以便更改跟踪可以跟踪您添加,修改和删除的实体,以便在您的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"); 
    } 
相关问题