使用 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 子句几乎没有用处(尽管您可能省略了相关代码)