【发布时间】:2010-07-21 16:57:23
【问题描述】:
当我知道实体 ID 时,我想更新实体的唯一字段。
在 LINQ to SQL 中是否可以不检索完整实体(DataContext 中的所有字段都是开销)?是否可以创建实体并将其附加到 DataContext 并标记要在 DataContext.SubmitChanges(或类似的东西)上同步的确切字段?
提前感谢您!
【问题讨论】:
标签: .net linq-to-sql
当我知道实体 ID 时,我想更新实体的唯一字段。
在 LINQ to SQL 中是否可以不检索完整实体(DataContext 中的所有字段都是开销)?是否可以创建实体并将其附加到 DataContext 并标记要在 DataContext.SubmitChanges(或类似的东西)上同步的确切字段?
提前感谢您!
【问题讨论】:
标签: .net linq-to-sql
是的,你可以:
Foo foo=new Foo { FooId=fooId }; // create obj and set keys
context.Foos.Attach(foo);
foo.Name="test";
context.SubmitChanges();
在您的 Dbml 中为所有属性设置 UpdateCheck="Never"。
这将生成一个没有选择的更新语句。
一个警告:如果您希望能够将 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
【讨论】:
您始终可以创建标准 T-SQL 语句并针对您的数据存储执行该语句:
YourDataContext
.ExecuteCommand("UPDATE dbo.YourTable SET ThatField = newValue WHERE ID = 777", null);
对于 Linq-to-SQL 本身,您不能这样做 - 它的基本假设是它始终对对象、整个对象以及对象以外的任何对象进行操作。
如果您需要定期执行此操作,一种方法是将其包装到存储过程中,并将该存储过程添加到您的数据上下文中,作为您可以在数据上下文中调用的方法。
【讨论】:
您可以刷新对象。此示例将更改此人的名字:
Person person = _entities.Persons.FirstOrDefault(p => p.Id == id);
person.FirstName = "Bill";
_entities.Refresh(System.Data.Objects.RefreshMode.ClientWins, person);
_entities.SaveChanges();
【讨论】: