我正在尝试在同一个屏幕上保存和编辑一条记录,但我认为我的逻辑有点混乱是他们使用实体框架这样做的一种更好的方法,我记得曾经遇到过一次或两次探测过的方法。
HTML.sublime-package
如果玩家已经编辑了他们的记录而不是添加新记录,那么玩家可能存在也可能不存在?
我在addtoplayers上也遇到错误
{"违反PRIMARY KEY约束' PK_player'。无法在对象' dbo.player'中插入重复的密钥。重复键值为(00000000-0000-0000-0000-000000000000)。\ r \ n语句已终止。"}
答案 0 :(得分:1)
Detaching无法帮助您。您应该保持附加状态,以便更改跟踪可以跟踪您添加,修改和删除的实体,以便在SaveChanges()
方法中使用。
您的主要密钥错误可能是由于您的GetNextPlayerId()
功能造成的。它似乎返回默认的Guid(),并且数据库中已经有一个默认的Guid()。确保它返回一个未使用的ID,或Guid.NewGuid()
几乎保证是唯一的。
对GetNextPlayerId()
函数可能更好的替代方法是在数据库中使用触发器或自动增量属性,以便在插入新行时自动设置密钥。使用Entity Framework,您可以在实体上指定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");
}