处理实体编辑和保存的更有效方法?

时间:2015-11-10 16:43:37

标签: c# entity-framework

我正在尝试在同一个屏幕上保存和编辑一条记录,但我认为我的逻辑有点混乱是他们使用实体框架这样做的一种更好的方法,我记得曾经遇到过一次或两次探测过的方法。

HTML.sublime-package

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

我在addtoplayers上也遇到错误

  

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

1 个答案:

答案 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");
    }