LINQ to SQL:如何在不检索整个实体的情况下更新唯一字段

时间:2010-07-21 16:57:24

标签: .net linq-to-sql

当我知道实体ID时,我想更新实体的唯一字段。

LINQ to SQL是否可以在不检索完整实体的情况下(DataContext中的所有字段都是开销)?是否可以创建并附加实体到DataContext并标记确切的字段以同步DataContext.SubmitChanges(或类似的东西)?

提前谢谢!

3 个答案:

答案 0 :(得分:8)

是的,你可以:

Foo foo=new Foo { FooId=fooId }; // create obj and set keys
context.Foos.Attach(foo);
foo.Name="test";
context.SubmitChanges();

在您的Dbml中为所有属性设置UpdateCheck =“Never”。

这将生成一个没有select的单个更新语句。

一个警告:如果您希望能够将Name设置为null,则必须将foo对象初始化为其他值,以便Linq可以检测到更改:

Foo foo=new Foo { FooId=fooId, Name="###" };
...
foo.Name=null;

如果您想在更新时检查时间戳,也可以这样做:

Foo foo=new Foo { FooId=fooId, Modified=... }; 
// Modified needs to be set to UpdateCheck="Always" in the dbml

答案 1 :(得分:1)

您始终可以创建标准T-SQL语句并对数据存储执行该语句:

YourDataContext
  .ExecuteCommand("UPDATE dbo.YourTable SET ThatField = newValue WHERE ID = 777", null);

使用Linq-to-SQL本身,你不能这样做 - 它的基本假设是它总是在对象,整个对象上运行,除了对象之外什么都没有。

如果您需要定期执行此操作,一种方法是将其包装到存储过程中,并将该存储过程作为可以在数据上下文上调用的方法添加到数据上下文中。

答案 2 :(得分:1)

您可以刷新对象。此示例将更改此人的名字:

Person person = _entities.Persons.FirstOrDefault(p => p.Id == id);
person.FirstName = "Bill";
_entities.Refresh(System.Data.Objects.RefreshMode.ClientWins, person);
_entities.SaveChanges();