假设以下方法存在于WCF服务中。 UI检索Status对象的实例,并使用此方法对服务进行后续调用。它不是像我期望的那样将状态分配给用户,而是尝试插入状态。我做错了什么?
void Method(Status status)
{
//not sure if this is even needed, the status never changed
context.Statuses.ApplyChanges(status);
//get the first user from the database
User user = context.Users.Where(u => u.Id = 1).First();
//set user status to some existing status
user.Status = status;
//this throws an exception due to EF trying to insert a new entry
//into the status table, rather than updating the user.StatusId column.
context.SaveChanges();
}
答案 0 :(得分:1)
请改为尝试:
using (Entities ctx = new Entities())
{
ctx.Statuses.Attach(status);
ObjectStateEntry entry = ctx.ObjectStateManager.GetObjectStateEntry(status);
entry.ChangeState(EntityState.Modified);
//get the first user from the database
User user = ctx.Users.Where(u => u.Id = 1);
//set user status to some existing status
user.StatusID = status.StatusID;
ctx.SaveChanges();
}
如果您有兴趣,可以点击tutorial on CRUD with Entity Framework。
答案 1 :(得分:1)
问题是您正在使用附加用户。当STE附加到上下文时,它的行为与任何其他实体完全相同。其自我跟踪机制的更多内容未激活。因此,在将状态设置为用户之前,必须将状态附加到上下文,否则它将作为必须插入的新实体进行跟踪:
void Method(Status status)
{
User user = context.Users.Where(u => u.Id = 1).First();
context.Attach(status);
user.Status = status;
context.SaveChanges();
}
答案 2 :(得分:0)
必须写一个答案,因为我还不能评论另一个答案(rep得分<50)[奇怪的是这个不对,但我知道为什么它就像那个]因为我想为@ Ladislav的回答增加一些清晰度。
来自WCF调用的Status
对象并非来自您用于查找context
对象的User
,因此跟踪代码无法修复上下文。这就是为什么附加它将允许您保存赋值,而context
认为status
是一个需要插入数据库的新实体。