如何使用实体通过单个查询更新字段而不使用键值

时间:2018-02-16 15:27:21

标签: c# entity-framework

class Amodel
{
    [Key]
    public virtual int ID { get; set; }
    public virtual string str1 { get; set; }
    public virtual string str2 { get; set; }
    public virtual string str3 { get; set; }
}

是否可以通过单个sql(强制实体生成它)使用Entity更新一个表,如下所示:UPDATE A SET str2 = 'com1', str3 = 'com2' WHERE str1 = 'val99'? ID不详。

编辑: 我不想使用纯SQL,我需要强制实体生成这样的(或类似的)sql。 我尝试过类似的东西,但这里实体使用ID来识别记录

var obj = new A{str1="com1", str2 = "com2", str3 = "val99"}
db.A.Attach(obj);
db.Entry(obj).Property(x => x.str1).IsModified = true;
db.Entry(obj).Property(x => x.str2).IsModified = true;  
db.SaveChanges();

1 个答案:

答案 0 :(得分:0)

如果您想要非常具体,可以直接针对上下文执行raw command;

using (var context = new BloggingContext()) 
{ 
    context.Amodel.SqlQuery("UPDATE Amodels SET str2='com1' WHERE str1='val999'"); 
}

如果需要更新非键值,那么您将需要创建一个存储过程,该过程将要更新的值和要更新的值作为参数。例如。如果你想调用这样的上下文;

context.UpdateAModelByStr1(amodel.Str2, amodel.Str1);

在数据库中创建存储过程,以便;

CREATE PROCEDURE UpdateAModelByStr1(@Str2Value nvarchar(50),
                                    @Str1UpdateBy nvarchar(50))
BEGIN
    UPDATE AModels
        SET Str2 = @Str2Value
        WHERE Str1 = @Str1UpdateBy
END

要将存储过程添加到EF上下文(确保首先在数据库中实际创建了SP),请转到实体数据模型(如果没有,请右键单击项目,添加 - > New Item并选择ADO.NET Entity Data Model。有关更详细的方法,请参阅here),右键单击模型中的任意位置并选择Update Model From Database,勾选存储过程和函数在“添加”选项卡中选择“UpdateAModelByStr1”框。单击“完成”后,现在会将一个名为UpdateAModelByStr1的新方法添加到您的上下文中,如上例所示。

虽然使用存储过程可能看起来比您想要做的更多,但EF并不是真正设计为具有SQL本身的完整功能集和灵活性,其目的是使标准CRUD内容更容易设置适用于常见场景的一些铃声和口哨声。