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();
答案 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内容更容易设置适用于常见场景的一些铃声和口哨声。