更有效地处理实体的编辑和保存
本文关键字:编辑 保存 实体 有效地 处理 | 更新日期: 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");
}