【问题标题】:LINQ to SQL: how to update the only field without retrieving whole entityLINQ to SQL:如何在不检索整个实体的情况下更新唯一字段
【发布时间】:2010-07-21 16:57:23
【问题描述】:

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

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

提前感谢您!

【问题讨论】:

    标签: .net linq-to-sql


    【解决方案1】:

    是的,你可以:

    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
    

    【讨论】:

    • 听起来很有趣。过几天我试试看!
    • 啊,是的,类似的方法适用于 EF。虽然我必须生成 EntityKey 属性以及主键属性的值。
    【解决方案2】:

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

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

    对于 Linq-to-SQL 本身,您不能这样做 - 它的基本假设是它始终对对象、整个对象以及对象以外的任何对象进行操作。

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

    【讨论】:

    • 天啊,可惜了。 EF的情况有变化吗?对于这种情况,您个人会依赖嵌入的 T-SQL 运算符或嵌入在模型中的存储过程吗?
    • 否 - EF 具有相同的方法 - 但 NHibernate 或任何其他 OR 映射器也是如此。它们旨在加载、操作和保存对象作为一个整体。我不知道有任何 ORM 可以让您只检索一个或两个字段,更改并保存它们....
    • 在EF中我们可以创建内存实体,初始化EntityKey属性+主键属性,然后附加,然后更改我们要更新的属性。 SaveChanges 适用于更新。
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢@Gnome。但是是否可以在不检索实体的情况下更新字段?
    • ;-) 我只是在重新阅读您的帖子。据我所知,您将需要该实体。但是这个解决方案避免了老式的 sql。
    • 是的,它避免了“老式”SQL - 但它需要先检索完整的实体,然后再次保存完整的实体。 “老派” SQL 可以很容易地解决这个问题.....
    猜你喜欢
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多