通过匿名类型更新数据库?

| 以下代码从我的活动表中获取所有尚未发布到Twitter上的行。然后,它遍历并为每个行发布Twitter更新。在此过程中,我想更新数据库以指示这些行现在已“被扭曲”。 但是,尝试更新此值时出现错误(如下所示)。我认为这是因为我使用的是匿名类型。但是,如果使用完整类型,则需要从数据库中提取很多不必要的数据。 有没有办法有效地做到这一点?还是这是EF强迫我在性能上做出让步的另一种情况?
using (MyEntities context = new MyEntities())
{
    var activities = from act in context.Activities
                     where act.ActTwittered == false
                     select new { act.ActID, act.ActTitle, act.Category,
                     act.ActDateTime, act.Location, act.ActTwittered };

    foreach (var activity in activities)
    {
        twitter.PostUpdate(\"...\");
        activity.ActTwittered = true; // <== Error: ActTwittered is read-only
    }
}
    
已邀请:
您可以尝试使用“伪对象方法”,如下所示:
using (MyEntities context = new MyEntities())
{
    var activities = from act in context.Activities
                     where act.ActTwittered == false
                     select new { act.ActID, act.ActTitle, act.Category,
                     act.ActDateTime, act.Location, act.ActTwittered };

    foreach (var activity in activities)
    {
        twitter.PostUpdate(\"...\");

        // Create fake object with necessary primary key
        var act = new Activity()
        {
            ActID = activity.ActID,
            ActTwittered = false
        };

        // Attach to context -> act is in state \"Unchanged\"
        // but change-tracked now
        context.Activities.Attach(act);

        // Change a property -> act is in state \"Modified\" now
        act.ActTwittered = true;
    }

    // all act are sent to server with sql-update statements
    // only for the ActTwittered column
    context.SaveChanges();
}
这是“理论”代码,不确定是否可以使用。 编辑 不再是“理论”。我已经用EF 4.1中的
DbContext
测试了它,它的工作原理如上面的示例代码所述。 (由于
DbContext
只是
ObjectContext
的包装API,因此几乎可以肯定,它也可以在EF 4.0中使用。)     
如果您只选择\'act \',那么它应该可以工作。编辑后不要忘记提交。     
为什么调用select new而不是返回整个对象。如果在框架资源中正确定义了属性,则实体框架将只能更新属性,而匿名类型肯定不是这种情况。 实体框架将永远无法确定属性映射到哪个表和哪个字段。     

要回复问题请先登录注册