我在PostgreSQL中编写了一个函数,用于插入如下:
CREATE OR REPLACE FUNCTION public.insert_blog("Url" character)
RETURNS void AS
$BODY$Begin
Insert Into "Blogs"("Url") Values("Url");
End$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.insert_blog(character)
OWNER TO postgres;
上述函数在Blogs
表中添加了一个条目(Url是一个参数)。
我试图在.Net Core(Npgsql.EntityFrameworkCore.PostgreSQL
)中使用此功能,如下所示:
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Create(Blog blog)
{
if (ModelState.IsValid)
{
//This works fine
var count = _context.Blogs.FromSql("Select insert_blog({0})", blog.Url).Count();
//This doesn't work -- it gives an error of "42601: syntax error at or near "insert_blog""
//var count = _context.Blogs.FromSql("insert_blog @Url={0}", blog.Url).Count();
return RedirectToAction("Index");
}
return View(blog);
}
有人可以告诉我为什么第二个命令不起作用?此外,即使第一个命令正常,它是否正确?
由于我必须编写.FromSql(...).Count()
才能使其正常工作,如果我删除.Count()
项目,则不会插入。{p>有人能告诉我为什么会这样吗?
是否有关于使用.FromSql()
或"在实体框架核心中使用Postgres功能的好文章" (我猜这是一个新功能,这就是为什么我无法找到相关数据的原因)?
答案 0 :(得分:0)
有人可以告诉我为什么第二个命令不起作用吗?同样,即使第一个命令有效,这是正确的方法吗?
这根本不是PostgreSQL语法的工作方式。 Select insert_blog({0})
确实是正确的方法。
因为我必须编写.FromSql(...)。Count()才能起作用。如果删除“ .Count()”项,则不会插入。有人可以告诉我为什么会这样吗?
FromSql
的行为类似于Where
和IQueryable
上的其他功能。执行将推迟到请求结果之前执行,因为它将尝试在一个数据库查询中完成所有操作。
要确保查询实际上已执行,您需要调用一个返回IQueryable
之外的值的方法,例如.Count()
或.ToList()
。可以在这里找到更多信息:https://docs.microsoft.com/en-us/ef/core/querying/overview#when-queries-are-executed