【问题标题】:More effecient way of dealing with edit and save of entity?处理实体编辑和保存的更有效方法?
【发布时间】:2015-11-10 16:43:37
【问题描述】:

我正在尝试在同一屏幕上保存和编辑记录,但我认为我的逻辑有点混乱,这是他们使用实体框架执行此操作的更好方法,我记得遇到过一次或两次分离的方法。

  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-000000000000)。\r\n语句已终止。”}

【问题讨论】:

  • 当您单步执行代码时,id 的值是多少。Empty.Guid 默认情况下是这个{00000000-0000-0000-0000-000000000000},您能否说明这些值是什么,以便我们为您提供帮助@ 987654325@你的逻辑陈述。错误消息还告诉您确切的问题是什么。您在主键字段中已经有一个带有{00000000-0000-0000-0000-000000000000} 的值,并且在创建Primary Key 时不允许重复
  • 您也应该将SaveChanges 调用包裹在try{}catch{} 周围,并对Response.Redirect("default.aspx"); 进行一次调用。有几种方法可以重构这段代码,避免多次调用同一个方法

标签: c# entity-framework


【解决方案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");
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2015-07-11
    • 2015-06-01
    相关资源
    最近更新 更多