有键约束时使用BulkMerge(DataTable, new string[],Boolen)异常 返回

SqlSugar 处理完成
15 159

使用pgsql,建表语句如下

CREATE TABLE byd_hd_map_db."test" (

id int8 NOT NULL,

fk_id_1 int8 NULL,

fk_id_2 int8 NULL,

        CONSTRAINT check_test_fk_id CHECK ((((fk_id_1 IS NULL) AND (fk_id_2 IS NOT NULL)) OR ((fk_id_1 IS NOT NULL) AND (fk_id_2 IS NULL)))),

CONSTRAINT test_pkey PRIMARY KEY (id)

);

测试例子如下


 

  using SqlSugar;
    using System.Collections.Generic;

 

    namespace SqlSugarClient_Demo
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                SqlSugarClient BDb = new SqlSugarClient(new ConnectionConfig()
                {
                    DbType = SqlSugar.DbType.PostgreSQL,
                    ConnectionString = Config.ConnectionString,
                    IsAutoCloseConnection = true
                },
                db => {
                    db.Aop.OnLogExecuting = (sql, pars) => { };
                });
                


var dt = new DataTable();
                dt.TableName = "Test"; //设置表名
                dt.Columns.Add(new DataColumn("id",typeof(int)));
dt.Columns.Add(new DataColumn("fk_id_1", typeof(int)));
dt.Columns.Add(new DataColumn("fk_id_2", typeof(int)));
var addRow = dt.NewRow();addRow["id"] = 1;addRow["fk_id_1"] = DBNull.Value;addRow["fk_id_2"] = 2;dt.Rows.Add(addRow);
addRow = dt.NewRow();addRow["id"] = 2;addRow["fk_id_1"] = 2 ;addRow["fk_id_2"] = DBNull.Value;dt.Rows.Add(addRow);
BDb.Fastest<DataTable>().AS("Test").BulkMerge(dt, new string[] { "id" }, false);

                                        }

        }
        [SugarTable("test")]
        public class Test
        {
            [SugarColumn(IsPrimaryKey = true,ColumnName = "id")]

 

            public int Id { getset; }
            [SugarColumn(ColumnName = "fk_id_1")]
            public intfk_id_1getset; }

                                   [SugarColumn(ColumnName = "fk_id_2")]

            public int?  fk_id_2getset; }
        }
    }


热忱回答15

  •  CONSTRAINT check_test_fk_id CHECK ((((fk_id_1 IS NULL) AND (fk_id_2 IS NOT NULL)) OR ((fk_id_1 IS NOT NULL) AND (fk_id_2 IS NULL)))),

    应该是这个键约束导致


    0 回复
  • var lstTests = new List<Test>();
    lstTests.Add(new Test() { Id = 1, Fk_id_1 = null,  Fk_id_2 = 2 });
    lstTests.Add(new Test() { Id = 2, Fk_id_1 = 2, Fk_id_2 = null });
    BDb.Fastest<Test>().BulkMerge(lstTests);

    使用这种指定实体方式正常,使用

    BulkMerge(DataTable, new string[],Boolen)不指定实体,有键约束CONSTRAINT check_test_fk_id CHECK ((((fk_id_1 IS NULL) AND (fk_id_2 IS NOT NULL)) OR ((fk_id_1 IS NOT NULL) AND (fk_id_2 IS NULL)))),异常


    0 回复
  • 我这边验证一下,看着像是主键不能为null

    0 回复
  • 应该不是主键的问题

    0 回复
  • 请问有进展吗

    0 回复
  • 0 回复
  • image.png


    你的DEMO我成功运行,并没有报错。

    0 回复
  • CONSTRAINT check_test_fk_id CHECK ((((fk_id_1 IS NULL) AND (fk_id_2 IS NOT NULL)) OR ((fk_id_1 IS NOT NULL) AND (fk_id_2 IS NULL))))

    你创建表的语句有这个键约束吗?我上面已经po了建表语句

    0 回复
  • fk_id_1和 fk_id_2这两个字段不能同时为空



    0 回复
  • 我这边试的是不行

    0 回复
  • @shelcon:我测试了不行,bulkcopy直接插入不进去。不用merge 直接插入也不行

    0 回复
  • 应该是无法支持

    0 回复
  • image.png

    应该是转成了0所以报错了。

    0 回复
  • 你约束在加个or 都不为空试试

    0 回复
  • SqlSugarCore 5.1.4.163-preview01



    已修复 过五分钟后更新到新预览版本

    0 回复