Jus*_*mes 8 c# ado.net entity-framework
我正在尝试使用附加使用EF 5.x对表进行更新.此表包含其他所需的字段,但它是现有行.所以我试图更新没有任何提取.userid是表的主键.我正在尝试更新状态.但它会抛出一个EntityValidationErrors,表示需要密码,这是另一个必填字段,但不是主键.由于这是对现有行的更新,为什么需要提供需要更新的字段?
var webUser = new WebUser() { UserId = webUserId, OnlineStatus = (sbyte)status };
using (var dbxupdate = new xEntities())
{
try
{
dbxupdate.WebUsers.Attach(webUser);
dbxupdate.Entry(webUser).State = EntityState.Modified;
dbxupdate.Entry(webUser).Property(x => x.OnlineStatus).IsModified = true;
dbxupdate.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
Kit*_*124 16
.Attach()
实际上只对更新分离方案中的实体有用,如下所示:
User entity = null;
using (var db = new DbContext())
{
entity = (from p in db.Users
where p.id == 1
select p).FirstOrDefault();
System.Diagnostics.Trace.WriteLine(entity.Name); //Outputs "Jane Doe"
}
entity.Name = "John Doe" //Modified while no longer connected to database
using (var db = new DbContext())
{
db.Users.Attach(entity);
db.Entry(entity).Property(a => a.Name).IsModified = true;
db.SaveChanges();
System.Diagnostics.Trace.WriteLine(entity.Name); //Now outputs "John Doe"
}
Run Code Online (Sandbox Code Playgroud)
在您的方案中,您正在创建的实体未被其密钥检索,并且数据库将其视为一个全新的实体.我假设您的密码是一个不可为空的字段,然后在尝试保存更改时导致EF抛出错误.如果您没有任何此类错误,那么EF将自动清空您未修改的任何字段,然后保存实体(这不是您正在寻找的结果).
为了进行您真正想要的更改,请尝试以下操作:
using (var db = new DbContext())
{
db.Users.Single(a => a.id == 1).OnlineStatus = (sbyte)status;
db.SaveChanges
}
Run Code Online (Sandbox Code Playgroud)
然后添加您想要的任何其他错误处理/验证代码.或者,您可以将实体存储在变量中,以便一次更改多个字段.EF应自动确定哪些值已更改,并仅生成进行这些更改所需的SQL.意思是如果你有类似的东西:
foreach (var item in entityList)
{
var entity = db.Users.Single(a => a.id == item.id);
entity.Name = item.Name;
entity.Address = item.Address;
}
Run Code Online (Sandbox Code Playgroud)
那么EF应该只更新实际受此代码影响的实体/字段.如果名称或地址保持不变,则EF会在将更改保存到数据库时跳过该实体的该字段.
归档时间: |
|
查看次数: |
18875 次 |
最近记录: |