如何使用Entity Framework多次更新表

时间:2016-09-26 20:21:35

标签: entity-framework asp.net-web-api

我有两个关系表,它们是:

表用户 - 表区域

-----------------   -----------------
'  idUser       '   '  idRegion     '
'-------------- '   '---------------'  
'  email        '   '  regionName   '
'---------------'   '---------------'
'  password     '   
'---------------'   
'  user_name    '   
'---------------'   
'  phone_number '   
'---------------'   
'  id_Region    '     
'---------------'   

就我而言,它有三种插入和更新数据的状态。

  1. 用户只会填充电子邮件和密码行。
  2. 用户可以填充其余行,包括RegionName。
  3. 最后,用户可以更新他想要的任何行,但电子邮件和密码。
  4. 所以,我已经做过的第一个案例,它很简单,第二个工作正常,但问题是当我第二次尝试更新时,在我的Regiontable内部创建了一个新行而不是更改选定的字段。

    我的代码:

    public HttpResponseMessage Update(UsersGetModel usersGetModel)
        {
            using (var context = new GoneDatabase())
            {
                try
                {
                    var user = context.users.Where(a => a.idUser== usersGetModel.id).FirstOrDefault();
                    user.userName = usersGetModel.Name;
                    user.PhoneNumber = usersGetModel.PhoneNumber;                  
                    user.Region = new region{ regionName= usersGetModel.Region };
                    context.Entry(user).State = System.Data.Entity.EntityState.Modified;
                    context.SaveChanges();
                    return Request.CreateResponse(HttpStatusCode.OK);
    
                }
                catch (Exception ex)
                {
                    return Request.CreateResponse(HttpStatusCode.BadRequest);
                }
            }
    

1 个答案:

答案 0 :(得分:0)

它正在创建一个新行,因为您通过在

构建区域实例来实际告诉它
user.Region = context.Set<Region>().Where(r => r.Name.Equals(usersGetModel.Region).SingleOrDefault();

相反,您需要从DbContext中检索现有的Region实例并使用它,如

{{1}}

一对夫妇注意到:

  1. &#34;的SingleOrDefault&#34;如果Region表中有多行与&#34; Where&#34;匹配,则会抛出异常标准
  2. 如果业务逻辑/规范指明了
  3. ,您需要在数据库表上设置一些约束以防止#1发生#1