我一直在探索在ASP.NET MVC3环境中编辑/更新实体框架5中的记录的不同方法,但到目前为止,它们都没有勾选我需要的所有框.我会解释原因.
我找到了三种方法,我将提到它的优点和缺点:
方法1 - 加载原始记录,更新每个属性
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
original.BusinessEntityId = updatedUser.BusinessEntityId;
original.Email = updatedUser.Email;
original.EmployeeId = updatedUser.EmployeeId;
original.Forename = updatedUser.Forename;
original.Surname = updatedUser.Surname;
original.Telephone = updatedUser.Telephone;
original.Title = updatedUser.Title;
original.Fax = updatedUser.Fax;
original.ASPNetUserId = updatedUser.ASPNetUserId;
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
优点
缺点
方法2 - 加载原始记录,设置更改的值
var original = db.Users.Find(updatedUser.UserId);
if (original != null)
{
db.Entry(original).CurrentValues.SetValues(updatedUser);
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
优点
缺点
方法3 - 附加更新的记录并将状态设置为EntityState.Modified
db.Users.Attach(updatedUser);
db.Entry(updatedUser).State = EntityState.Modified;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
优点
让我们假设我有一个在Entity Framework中直接执行sql命令的有效需求.我无法弄清楚如何在我的sql语句中使用参数.以下示例(不是我的实例)不起作用.
var firstName = "John";
var id = 12;
var sql = @"Update [User] SET FirstName = @FirstName WHERE Id = @Id";
ctx.Database.ExecuteSqlCommand(sql, firstName, id);
Run Code Online (Sandbox Code Playgroud)
ExecuteSqlCommand方法不允许您传入ADO.Net中的命名参数,并且此方法的文档未提供有关如何执行参数化查询的任何示例.
如何正确指定参数?
这是桌子
用户
UserId
UserName
Password
EmailAddress
Run Code Online (Sandbox Code Playgroud)
和代码..
public void ChangePassword(int userId, string password){
//code to update the password..
}
Run Code Online (Sandbox Code Playgroud) 我通过阅读本文和许多其他文章编写了我自己的上下文,但没有一个主题解释了这个context.Entry(obj)定义的位置,我的意思是即使阅读本文,我也无法理解如何实现此方法,并且我得到以下错误:
错误36'Domain.Entities.OurWebSiteContext'不包含'Entry'的定义,并且没有扩展方法'Entry'可以找到接受类型为'Domain.Entities.OurWebSiteContext'的第一个参数(你是否缺少using指令或者装配参考?)
请有人帮帮我
编辑>>
public class OurWebSiteContext : DbContext
{
public OurWebSiteContext(string connString)
: base(connString)
{
}
public DbSet<Article> Articles { get; set; }
public DbSet<Category> Categories { get; set; }
public DbSet<Comment> Comments { get; set; }
}
Run Code Online (Sandbox Code Playgroud) I have a method for updating some tables. For update I need get first of TestProcess, but I don't like that. How can I update TestProcess without select(firstOrDefault) operation, used only for the update operation?
Example of method:
public void UpdateTestProcess(int id, string updateID)
{
using (TestEntities context = new TestEntities())
{
TestProcess pr = context.TestProcess.FirstOrDefault(x => x.MyID == id);
pr.UpdateID = updateID;
context.TestProcess.Attach(pr);
context.ObjectStateManager.ChangeObjectState(pr, EntityState.Modified);
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个员工对象说:
public class Employee
{
public int Id {get; set;}
public int Name {get; set;}
public int Address {get; set;}
...other few 10's of properties
}
Run Code Online (Sandbox Code Playgroud)
问题是我如何才更新Name?例如.如果我想更新姓名我做
Employee e = Db.Employees.Where(e => e.Id == someId).SingleOrDefault();
e.Name = "Jack";
Db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
如您所见,为了更新,我必须首先获取对象然后更新,然后调用SaveChanges().对于可以在对数据库的单个查询中完成的任务,我必须触发2个查询:1)获取对象2)更新所需对象并保存更改.
对于传统的存储过程方法,我只需传递Id,传递新的Name并编写Update语句,我就完成了.实体框架真的效率低下还是我错过了什么?