使用 npgsql 插入 postgres 行
Insert postgres row using npgsql
在我的 postgres 数据库中,我的 table 的键是 postgres 数据库自动递增的串行数据类型。使用 C#、Npgsql、Entity Framework 6、WPF、linq 和 EF dbsets(任何扩展方法?),有没有办法实现存储库方法,例如:
public virtual void Add(TEntity entity, string addrow)
{NpgsqlCommand cmd = new NpgsqlCommand(addrow, DbConnect);
cmd.ExecuteNonQuery();}
viewmodel 会传递类似这样的字符串参数:
_addRow = string.Format("insert into mytable ('descrip') values ( " + DescripProperty + ") returning 'mytable_id' into mytableID");
这是插入具有自动增量键的 postgres 行/记录的正确方法吗?或者我是否需要利用 PL/pgSQL - SQL 过程语言函数来首先锁定 table 并从该服务器端进行插入?先感谢您。
编辑 --------------------------
为了清楚起见,我将 EF DbContext 传递给了 genericrepository 构造函数。此代码位于 genericrepository class:
private readonly DbSet<TEntity> _aquery;
public DbSet<TEntity> AQuery;
// CTOR - inject dbcontext/entities
public GenericRepository(MyContextClass context)
{
if (context == null)
throw new ArgumentNullException("context");
_theDbContext = context;
_aquery = _theDbContext.Set<TEntity>();
AQuery = _aquery;
}
所以我可以AQuery.AsQueryable,等等
您的 SQL 查询是正确的,因为序列号将由 PostgreSQL 自动生成,然后 return 新 ID - 不需要 pl/pgsql 或任何显式锁定 - PostgreSQL 的串行机制是原子的并且可以工作。但是,对您的代码有几点评论:
- 您正在完全传递 Entity Framework 并使用原始 SQL 进行处理。 ORM 的全部意义在于为您生成这种语句,因此您不必这样做,而 EF6 完全有能力这样做。
- 将参数连接到您的 SQL 查询中是一个坏主意,并且会打开 SQL 注入的大门。您应该改用参数。
- 您似乎并没有真正使用 returned ID,因此
returning
子句几乎没有用处(尽管您可能省略了相关代码)
在我的 postgres 数据库中,我的 table 的键是 postgres 数据库自动递增的串行数据类型。使用 C#、Npgsql、Entity Framework 6、WPF、linq 和 EF dbsets(任何扩展方法?),有没有办法实现存储库方法,例如:
public virtual void Add(TEntity entity, string addrow)
{NpgsqlCommand cmd = new NpgsqlCommand(addrow, DbConnect);
cmd.ExecuteNonQuery();}
viewmodel 会传递类似这样的字符串参数:
_addRow = string.Format("insert into mytable ('descrip') values ( " + DescripProperty + ") returning 'mytable_id' into mytableID");
这是插入具有自动增量键的 postgres 行/记录的正确方法吗?或者我是否需要利用 PL/pgSQL - SQL 过程语言函数来首先锁定 table 并从该服务器端进行插入?先感谢您。
编辑 -------------------------- 为了清楚起见,我将 EF DbContext 传递给了 genericrepository 构造函数。此代码位于 genericrepository class:
private readonly DbSet<TEntity> _aquery;
public DbSet<TEntity> AQuery;
// CTOR - inject dbcontext/entities
public GenericRepository(MyContextClass context)
{
if (context == null)
throw new ArgumentNullException("context");
_theDbContext = context;
_aquery = _theDbContext.Set<TEntity>();
AQuery = _aquery;
}
所以我可以AQuery.AsQueryable,等等
您的 SQL 查询是正确的,因为序列号将由 PostgreSQL 自动生成,然后 return 新 ID - 不需要 pl/pgsql 或任何显式锁定 - PostgreSQL 的串行机制是原子的并且可以工作。但是,对您的代码有几点评论:
- 您正在完全传递 Entity Framework 并使用原始 SQL 进行处理。 ORM 的全部意义在于为您生成这种语句,因此您不必这样做,而 EF6 完全有能力这样做。
- 将参数连接到您的 SQL 查询中是一个坏主意,并且会打开 SQL 注入的大门。您应该改用参数。
- 您似乎并没有真正使用 returned ID,因此
returning
子句几乎没有用处(尽管您可能省略了相关代码)