如何使用参数使用官方 Neo4j .Net 驱动程序更新节点属性



我想在 mvc 应用程序中使用 .Net 的 Neo4j 官方驱动程序更新模型中 asp.net 值。我的代码是:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(string name, Category category)
{
try
{
var oldName = name.ToString();
var newName = category.Name.ToString();
using (var session = _driver.Session())
{
session.WriteTransaction(tx =>
{
tx.Run("Match (a:Category) WHERE a.Name = '$oldName' Set a.Name = '$newName'", new { oldName, newName });
});
}
return RedirectToAction(nameof(Index));
}
catch
{
return View();
}
}

但是代码的结果没有变化。为什么?

型号类别:

public class Category
{
public string Name { get; set; }
}

我从视图中的这段代码中获取name值:

@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { name = item.Name/* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}

您不需要在查询中用引号将参数括起来 - Neo4j 将为您解决这个问题。

尝试:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(string name, Category category)
{
try
{
var oldName = name.ToString();
var newName = category.Name.ToString();
using (var session = _driver.Session())
{
session.WriteTransaction(tx =>
{
tx.Run("Match (a:Category) WHERE a.Name = $oldName Set a.Name = $newName", new { oldName, newName });
});
}
return RedirectToAction(nameof(Index));
}
catch
{
return View();
}
}

在参数部分中,只需提供其属性名称与查询中的参数名称匹配的任何对象。在您的示例中,new { oldName, newName }部分是创建具有两个属性的匿名 C# 对象的简写,一个称为oldName,另一个称为newName,其值取自定义的变量。

你可以等效地让一个类来表示你的参数:

class MyParams {
public string oldName { get; set; }
public string newName { get; set; }
}
var p = new MyParams { oldname = name, newName = category.Name };
tx.Run("Match (a:Category) WHERE a.Name = $oldName Set a.Name = $newName", p);

我更喜欢匿名对象方法,您的口味可能会有所不同。

相关内容