C# 动态LINQ-实体框架6-更新动态选择的记录

C# 动态LINQ-实体框架6-更新动态选择的记录,c#,entity-framework-6,dynamic-linq,C#,Entity Framework 6,Dynamic Linq,C新手。下面是我的代码,我花了几个小时来更新数据库中的一些字段,并尝试了许多不同的实现,但都没有成功 // Select all fields to update using (var db = new Entities()) { // dbFields are trusted values var query = db.tblRecords .Whe

C新手。下面是我的代码,我花了几个小时来更新数据库中的一些字段,并尝试了许多不同的实现,但都没有成功

        // Select all fields to update
        using (var db = new Entities())
        {
            // dbFields are trusted values
            var query = db.tblRecords
                         .Where("id == " + f.id)
                         .Select("new(" + string.Join(",", dbFields.Keys) + ")");

            foreach (var item in query)
            {
                foreach (PropertyInfo property in query.ElementType.GetProperties())
                {
                    if (dbFields.ContainsKey(property.Name))
                    {
                        // Set the value to view in debugger - should be dynamic cast eventually
                        var value = Convert.ToInt16(dbFields[property.Name]);
                        property.SetValue(item, value);

                        // Something like this throws error 'Object does not match target type'
                        // property.SetValue(query, item);
                    }
                }
            }
            db.SaveChanges();
        }
上述代码在运行时不会导致对数据库的任何更改。显然,这段代码需要一些清理,但我正在尝试让基本功能正常工作。我相信我可能需要做的是以某种方式将“item”重新应用到“query”中,但无论我尝试什么实现,我都没有运气让它工作,我总是收到“Object not match target type”

这个半相似的问题重申了这一点,但我并不十分清楚,因为我使用的是动态LINQ查询,不能直接引用属性名

执行“选择新”操作时。。。它只选择特定字段,不会为您跟踪更新。我认为如果您将查询更改为此,它将起作用:

var query = db.tblRecords.Where(x=>x.id == id);
当你做一个选择新。。。它只选择特定字段,不会为您跟踪更新。我认为如果您将查询更改为此,它将起作用:

var query = db.tblRecords.Where(x=>x.id == id);

实体框架将为您在实体上执行更新,而不是在自定义结果上执行更新。您的tblRecords包含许多实体,如果您希望实体框架提供帮助,则需要操纵这些实体。删除您的投影调用Select,查询将直接返回包含太多列的对象,是的,但稍后我们将讨论这一点

动态更新的执行方式与C中任何其他动态赋值的执行方式相同,因为您需要处理一个普通对象。实体框架将跟踪您所做的更改,并在调用SaveChanges时生成和执行相应的SQL查询

但是,如果您首先要优化并停止选择和创建内存中的所有值,即使是不需要的值,也可以从内存执行更新。如果您自己创建了一个正确类型的对象并分配了正确的ID,则可以使用该方法将其添加到当前上下文中。从那时起,Entity Framework将记录任何更改,当您调用SaveChanges时,所有更改都应发送到数据库:

// Select all fields to update
using (var db = new Entities())
{
    // Assuming the entity contained in tblRecords is named "ObjRecord"
    // Also assuming that the entity has a key named "id"
    var objToUpdate = new ObjRecord { id = f.id };

    // Any changes made to the object so far won't be considered by EF

    // Attach the object to the context
    db.tblRecords.Attach(objToUpdate);

    // EF now tracks the object, any new changes will be applied

    foreach (PropertyInfo property in typeof(ObjRecord).GetProperties())
    {
        if (dbFields.ContainsKey(property.Name))
        {
             // Set the value to view in debugger - should be dynamic cast eventually
             var value = Convert.ToInt16(dbFields[property.Name]);
             property.SetValue(objToUpdate, value);
        }
    }

    // Will only perform an UPDATE query, no SELECT at all
    db.SaveChanges();
}

实体框架将为您在实体上执行更新,而不是在自定义结果上执行更新。您的tblRecords包含许多实体,如果您希望实体框架提供帮助,则需要操纵这些实体。删除您的投影调用Select,查询将直接返回包含太多列的对象,是的,但稍后我们将讨论这一点

动态更新的执行方式与C中任何其他动态赋值的执行方式相同,因为您需要处理一个普通对象。实体框架将跟踪您所做的更改,并在调用SaveChanges时生成和执行相应的SQL查询

但是,如果您首先要优化并停止选择和创建内存中的所有值,即使是不需要的值,也可以从内存执行更新。如果您自己创建了一个正确类型的对象并分配了正确的ID,则可以使用该方法将其添加到当前上下文中。从那时起,Entity Framework将记录任何更改,当您调用SaveChanges时,所有更改都应发送到数据库:

// Select all fields to update
using (var db = new Entities())
{
    // Assuming the entity contained in tblRecords is named "ObjRecord"
    // Also assuming that the entity has a key named "id"
    var objToUpdate = new ObjRecord { id = f.id };

    // Any changes made to the object so far won't be considered by EF

    // Attach the object to the context
    db.tblRecords.Attach(objToUpdate);

    // EF now tracks the object, any new changes will be applied

    foreach (PropertyInfo property in typeof(ObjRecord).GetProperties())
    {
        if (dbFields.ContainsKey(property.Name))
        {
             // Set the value to view in debugger - should be dynamic cast eventually
             var value = Convert.ToInt16(dbFields[property.Name]);
             property.SetValue(objToUpdate, value);
        }
    }

    // Will only perform an UPDATE query, no SELECT at all
    db.SaveChanges();
}

你为什么需要这个新的。。。?如果删除Select,则tblRecords中将包含实体。更改这些将导致EF跟踪的更改。为什么需要此Selectnew。。。?如果删除Select,则tblRecords中将包含实体。更改这些将导致EF跟踪的更改。工作正常,更有意义1000倍感谢您的帮助!它认为应该是db.ObjRecord.attachobjtupdate而不是db.attachobjtupdate。再次感谢@绝对是我的错。这就是你从记忆中输入的结果!工作,使1000倍更有意义感谢帮助吨!它认为应该是db.ObjRecord.attachobjtupdate而不是db.attachobjtupdate。再次感谢@绝对是我的错。这就是你从记忆中输入的结果!