LINQ to SQL更新多主键数据表的主键值

作者:獅子內心的OS  发布日期:2012-12-10 19:02:50

今天要用 LINQ to SQL (Oracle) 更新某字段值时,发现无法更新成功,但是没有错误讯息。范例数据和更新的 LINQ 语法如下:(LINQPad 版本)

 




 

执行没有错误,但是序号 3 的 ID 字段值并没有修改为「X」,仍保留原有的「C」,所以就检查一下 LINQ to SQL 所产生的 SQL Script:

 

SELECT * FROM (SELECT t0.ID, t0.NAME, t0.SN
FROM FOO t0
WHERE (t0.SN = 3)) WHERE ROWNUM<=1

UPDATE FOO
SET NAME = :p1
WHERE ((ID = :p0) AND (SN = 3))
-- p0 = [X]
-- p1 = [PINK]

SELECT t0.ID, t0.NAME, t0.SN
FROM FOO t0
WHERE (t0.SN = 3)

 

发现上面 Update 语法中,把 ID 字段放到 Where 条件里,而条件值是我在 LINQ 中更新的「X」,所以执行时不会发生错误,只是更新 0 笔。看到这个状况后,猜想原因应该是资料表为多主键结构,而我要更新的字段是主键之一,所以到 DB 中查一下:

CREATE TABLE FOO
(
  sn   NUMBER NOT NULL,
  ID   VARCHAR2(20) NOT NULL,
  NAME VARCHAR2(200)
);
COMMENT ON TABLE FOO
  IS 'LEO测试资料表';
COMMENT ON COLUMN FOO.sn
  IS '流水号';
COMMENT ON COLUMN FOO.id
  IS '证号';
COMMENT ON COLUMN FOO.name
  IS '姓名';
ALTER TABLE FOO
  ADD CONSTRAINT PK_FOO PRIMARY KEY (SN, ID)
  USING INDEX ;


 

果不其然,SN 和 ID 是复合主键。但是更新 ID 的需求仍然存在,该怎么办?『理想世界』的解法是:

移除原本的双主键结构。
设定 SN 字段为 Primary key。
设定 SN + ID 为 Unique index。
类似的方法还有加一个新的字段当主键之类的方式,但这都是理想世界的解法啊!一个运行多年的庞大系统,要异动数据表的结构可是要经过重重关卡审核,还要附保证书(保证系统中其它上百个功能不会因此发生问题),只为了能够透过 LINQ to SQL 修改其中一个主键值?CP 值太低了。所以干脆改用一删一加的方式处理:  www.it165.net

 


 

上述语法会转换为以下的 SQL:

 

SELECT t0.ID, t0.NAME, t0.SN
FROM FOO t0
WHERE (t0.SN = 3)

SELECT * FROM (SELECT t0.ID, t0.NAME, t0.SN
FROM FOO t0
WHERE (t0.SN = 3)) WHERE ROWNUM<=1

DELETE FROM FOO
WHERE ((ID = :p0) AND (SN = 3))
-- p0 = [C]

INSERT INTO FOO(ID, NAME, SN)
VALUES (:p0, :p1, 3)
-- p0 = [X]
-- p1 = [PINK]

SELECT t0.ID, t0.NAME, t0.SN
FROM FOO t0
WHERE (t0.SN = 3)


 

先删后加的原因是,避免重复执行时发生主键重复的错误,不过上述做法一定要确保他们是在【同一个交易中】执行,不然数据删完,新增不回去,事情就大条了!!!

 

Tag标签: LINQ   SQL   主键数据表   主键值  
  • 专题推荐

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规