我在PL / SQL中创建了一个触发器,当在表中插入行之前触发该触发器,这通过Oracle序列增加值,然后作为主键插入表中。
这是我在PL / SQL中的触发器代码:
create or replace trigger FUT_SYS_USER_BE_I
before insert on FUT_SYS_USER referencing old as O new as N
for each row
declare
--local variables here
begin
if :N.SYS_USER_ID is null then
:N.SYS_USER_ID := SYS_USER_SEQ.NEXTVAL;
end if;
end FUT_SYS_USER_BE_I;
但是这个触发器永远不会执行,因为当我插入一行时,主键SYS_USER_ID
永远不会增加并保存零值。
这是我来自C#的代码:
using(DemoDBEntities db = new DemoDBEntities())
{
FUT_SYS_USER SU = new FUT_SYS_USER();
SU.LOGIN_NAME = user.LoginName;
SU.PASSWORD_ENCRYPTED_TEXT = user.Password;
SU.ROW_CREATED_SYSUSER_ID = user.SYSUserID > 0 ? user.SYSUserID : 1;
SU.ROW_MODIFIED_SYSUSER_ID = user.SYSUserID > 0 ? user.SYSUserID : 1;
SU.ROW_CREATED_DATETIME = DateTime.Now;
SU.ROW_MODIFIED_DATETIME = DateTime.Now;
db.FUT_SYS_USER.Add(SU);
db.SaveChanges();
}
关于如何解决此问题的任何想法?
答案 0 :(得分:0)
您需要告诉EF这是一个由数据库填充的列。如果您打开.edmx
设计器,请选择相关列,然后查看其属性。您正在寻找的是 StoreGeneratedPattern 属性,可以将其设置为"无" (默认),或" Computed"或"身份"。
我不确定哪一个可以在Oracle中运行,但在SQL Server中,对于identity
列(在插入行时由SQL Server自动增加),我总是设置StoreGeneratedPattern=Identity
- 在这种情况下,EF不会向此列的数据库发送值,然后您的触发器应该正常工作。
答案 1 :(得分:0)
您需要在该列的.edmx
模型属性中为密钥列(SYS_USER_ID)的Identity设置 StoreGeneratedPattern 。如果您将来从.edmx
模型中删除该表并重新创建,则需要再次设置该表。