'相同类型的实体已具有相同的主键值'使用AutoMapper时出错

时间:2015-09-04 16:59:27

标签: c# entity-framework automapper

当我使用AutoMapper时,发生此错误:

  

附加类型' MyProject.DAL.User'的实体。失败,因为同一类型的另一个实体已具有相同的主键值。使用'附加'方法或将实体的状态设置为“未更改”#39;或者'修改'如果图中的任何实体具有冲突的键值。这可能是因为某些实体是新的并且尚未收到数据库生成的键值。在这种情况下,请使用'添加'方法或“添加”#39;实体状态跟踪图形,然后将非新实体的状态设置为“未更改”。或者'修改'酌情。

我想在从数据库中检索User时将User映射到UserModel。我在UI中更改UserModel属性,然后再将其映射到User并更新它。 我的代码在这里:

public UserModel GetUserByUserId(int id)
    {
        var user = db.Users.Where(p => p.UserId == id).FirstOrDefault();
        var userModel = Mapper.Map<UserModel>(user);
        return userModel;
    }

public void Update(UserModel userModel)
    {
        var user = Mapper.Map<User>(userModel);
        db.Entry(user).State = EntityState.Modified;
        db.SaveChanges();
    }

但如果我不使用自动映射器并编写类似下面代码的内容,则它可以正常工作。

public void Update(UserModel userModel)
    {
        updatingUser.Email = userModel.Email;
        updatingUser.FirstName = userModel.FirstName;
        updatingUser.ModifiedDate = DateTime.Now;
        updatingUser.LastName = userModel.LastName;
        updatingUser.Password = userModel.Password;
        updatingUser.UserName = userModel.UserName;

        db.Entry(updatingUser).State = EntityState.Modified;
        db.SaveChanges();
    }

我该怎么做:

2 个答案:

答案 0 :(得分:15)

这可能只是我没有意识到某些功能,但你的update功能看起来很时髦。我没有看到它如何将新的user与数据库中现有的public void Update(UserModel userModel) { var user = db.Users.Find(userModel.UserId); Mapper.Map(userModel, user); db.SaveChanges(); } 相关联。

这就是我接近它的方式。

update

或者,如果您愿意像第二个public void Update(UserModel userModel) { Mapper.Map(userModel, updatingUser); db.Entry(updatingUser).State = EntityState.Modified; db.SaveChanges(); } 函数那样

TLConfig config = api.doRpcCall(new TLRequestHelpGetConfig());

答案 1 :(得分:-4)

对象A和他的子对象B,然后设置所有属性,然后将其刷新到。 我们不再:附上(前一个对象A和B) 我们不再单独获取对象B.