实体框架部分加载

Jam*_*mes 4 c# entity-framework entity-framework-5

我的表中有以下列

  • Id(int)
  • 名称(nvarchar)通常<100个字符
  • 数据(nvarchar)平均为1MB

我正在编写一个程序,它将遍历每一行并对Name字段执行一些操作.由于我只使用Name字段并且Data字段非常大,是否可以指示EF仅加载Id和Name字段?

Not*_*ple 6

当然可以

ctx.YourDbSet.Select(p=> new { Id = p.Id, Name = p.Name});
Run Code Online (Sandbox Code Playgroud)

这个方法是选择一个匿名类.

如果你想再次保存这个,你可以用我称之为虚拟实体的东西来做到这一点:

foreach(var thing in ctx.YourDbSet.Select(p=> new { Id = p.Id, Name = p.Name}))
{
    var dummy = new YourEntity{Id = thing.Id};
    ctx.YourDbSet.Attach(dummy);
    dummy.Name = thing.Name + "_";
}
ctx.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

此方法适用于快照跟踪,因为EF仅跟踪在更新语句中发送回附加调用之后所做的更改.这意味着您的查询将只包含该实体上name属性的更新(即它不会触及数据)

注意:您希望确保在严格控制的上下文中执行此操作,因为您无法附加已附加到EF跟踪图的对象.在上面的例子中,select 不会将实体作为匿名附加到图形中(因此使用相同的上下文是安全的)