当我使用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();
}
我该怎么做:
答案 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.